Получить каталог решений в 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 для этого пути, чтобы мы могли включить правильную цель, чтобы при публикации из visual studio она публиковалась в конкретном проекте, а не в обычном.
Я попытался найти "MSBuildSolutionDirectory", но это только переменная "MSBuildProjectDirectory", которую можно использовать.
Кто-нибудь знает, как я мог получить путь
Project="c:\proj\vanilla\publishsettings.targets"
на самом деле быть
Project="c:\proj\specific\publishsettings.targets"
используя какую-то msbuild или пользовательскую переменную, а не жестко ее кодировать?
Мне нужно, чтобы он работал как с vanilla (так как у меня vanilla.sln), так и с конкретным проектом (так как у меня X.sln).
1 ответ
Вот способ сделать свою собственную версию MSBuildSolutionDirectory
Вы надеялись увидеть встроенное:
<PropertyGroup>
<SolutionDirectory>$([MSBuild]::GetDirectoryNameOfFileAbove(`$(MSBuildProjectDirectory)`, `YOUR_SOLUTION_NAME.sln`))\</SolutionDirectory>
</PropertyGroup>
Примечания о GetDirectoryNameOfFileAbove
Функция свойства MSBuild:
$([MSBuild]::GetDirectoryNameOfFileAbove(directory, filename)
Выполняет поиск в указанном каталоге, затем постепенно в родительских каталогах, пока не найдет предоставленный файл или не попадет в корневой каталог. Затем он возвращает путь к этому корню.
- Из моего собственного тестирования:
- Возвращенный путь не включает в себя обратную косую черту.
- Если имя файла не найдено, возвращается пустая строка.