Подтвердить что ты не робот

Как я могу получить путь к текущему файлу msbuild?

Я пишу файл 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)'" />
4b9b3361

Ответ 1

Способ, которым 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 4.0

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

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot