Как я могу получить путь к текущему файлу msbuild? - PullRequest
27 голосов
/ 10 марта 2010

Я пишу файл msbuild .targets, и в нем я хочу использовать задачу zip, чтобы заархивировать некоторые файлы, которые я знаю, относительно файла .targets.

Это работает нормально, когда я запускаю файл .target напрямую. Но когда я включаю файл .targets в файл .proj, который находится в другом каталоге, относительные пути разрешаются относительно файла .proj, а не файла .targets.

Есть ли способ указать относительные пути относительно файла, в который я их записал?


Я видел этот связанный вопрос:

Как указать относительный путь в файле msbuild?


Обходной путь, о котором я подумал, - это сделать следующее. Я еще не пробовал. Будет ли это работать, есть ли лучший способ?

my.proj

<Import Project="..\Somewhere\my.targets"/>
<PropertyGroup>
   <MyTargetsYouAreHere>$(MSBuildProjectDirectory)\..\Somewhere</MyTargetsYouAreHere>
</PropertyGroup>

my.targets

<Message Text="my.targets is here '$(MyTargetsYouAreHere)'" />

1 Ответ

61 голосов
/ 11 марта 2010

Способ работы MSBuild при обработке файлов заключается в чтении всех файлов и создании одного в памяти представления всех этих файлов. Все это происходит до того, как цель будет выполнена. Из-за этого, когда цель выполняется, она не имеет понятия о том, в каком файле она содержалась. По сути, вы не сможете использовать относительные пути внутри файлов .targets. Чтобы справиться с этой ситуацией, убедитесь, что ваши исходящие файлы .proj ( или любое расширение, которое вы используете ) объявляют известное свойство, которое ваш файл .targets использует для определения полного пути к общим файлам.

Например

Sample.targets

<Project ...>
    <Target Name="ExecTool">
        <Exec Command="$(YourToolPath)tool.exe" />
    </Target>

</Project>

Build.proj

<Project ...>
    <PropertyGroup>
        <YourToolPath>$(MSBuildProjectDirectory)\..\</YourToolPath>
    </PropertyGroup>

    <Import Project="..\..\..\Sample.targets"/>
</Project>

В соответствующей заметке я обсуждал проверку таких «общих» свойств в своем блоге некоторое время назад на Элементы повторно используемых скриптов MSBuild: валидация .

MSBuild v. 4.0 и выше

Если вы используете MSBuild 4.0 (или выше), т. Е. Visual Studio 2010 / .NET 4.0 (который может быть нацелен на .NET 2.0 / 3.0 / 3.5). Тогда у вас есть эти свойства , которые можно использовать для этой конкретной цели:

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...