2017-01-25 42 views
1

У меня есть решение, состоящее из разных проектов с другого пути. Мы используем проекты фундамента из папки ванили, а затем проектируем конкретные проекты из определенного каталога. Пример:Получить каталог решений в VS файл профиля публикации

specific project directory: c:\proj\specific 

vanilla project directory: c:\proj\vanilla 

vanilla project x path: c:\proj\vanilla\repo\src\project\x\code\ 

В каждом ванильным проекте имеем а опубликовать профиль, который указывает на корневой каталог и включает в себя файл publishsettings.targets, который имеет реальную цель, когда проект должен быть опубликован. Используя эту структуру, мы можем иметь много проектов и публиковать их с использованием единой цели, поэтому нам не нужно менять эту цель во всех проектах.

Мы обнаружили, что у нас есть проблема при использовании этих проектов ванили, поскольку путь, используемый в профиле публикации, относится к ванильному каталогу, и нам действительно нужно, чтобы он относился к конкретной директории проекта (директории решений).

В нашей публикации профиле мы имеем:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="..\..\..\..\..\..\publishsettings.targets" /> 
    <PropertyGroup> 
    ... 
    </PropertyGroup> 
</Project> 

Поэтому нам нужен способ, чтобы определить фактическую Sln каталога на этот путь, чтобы мы могли включить правильную цель так, когда мы делаем публиковать от визуальной студии она будет публиковать на конкретный проект, а не ванильный.

Я попытался найти «MSBuildSolutionDirectory», но это, похоже, является переменной «MSBuildProjectDirectory», которая может быть использована.

Кто-нибудь знает, как я мог бы получить путь

Project="c:\proj\vanilla\publishsettings.targets" 

на самом деле быть

Project="c:\proj\specific\publishsettings.targets" 

с помощью некоторых MSBuild или пользовательскую переменную, а не жестко прописывать его?

Мне нужно, чтобы он работал как с ванилью (так как у меня есть vanilla.sln), а также с конкретным проектом (как у меня есть X.sln).

ответ

1

Вот способ сделать свою собственную версию из MSBuildSolutionDirectory вы надеялись увидеть построенный в:

<PropertyGroup> 
    <SolutionDirectory>$([MSBuild]::GetDirectoryNameOfFileAbove(`$(MSBuildProjectDirectory)`, `YOUR_SOLUTION_NAME.sln`))\</SolutionDirectory> 
    </PropertyGroup> 

Примечания по функции GetDirectoryNameOfFileAbove MSBuild собственности:

$([MSBuild]::GetDirectoryNameOfFileAbove(directory, filename) Loo ks в указанном каталоге, а затем постепенно в родительских каталогах , пока не найдет предоставленный файл или не попадет в корень. Затем он возвращает путь к этому корню.

  • Из моего собственного тестирования:
    • Возвращенный путь не включает обратную косую черту.
    • Если имя файла не найдено, возвращается пустая строка.
+0

Как я могу видеть из Вашего комментария, он ищет в каталоге, и, как я сказал, что конкретный SLn не в том же пути к каталогу с ванильными проектами поэтому он никогда не найдет * .sln файла с момента этот файл находится в каталоге c: \ proj \ specific \ specific.sln, а проекты с ванилью находятся в каталоге c: \ proj \ vanilla \ поэтому не уверены, поможет ли это решение. –

+0

Каковы пути к vanilla.sln и X.sln? Я предполагаю, что вы заметили, что функция ищет выше, а не внутри, в каталоге проекта и направлена ​​на то, чтобы вы нашли директорию решений (о которой вы говорите, что хотите надеяться). – weir