Получить каталог решений в 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) Выполняет поиск в указанном каталоге, затем постепенно в родительских каталогах, пока не найдет предоставленный файл или не попадет в корневой каталог. Затем он возвращает путь к этому корню.

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