如何获取当前msbuild文件的路径?

Sco*_*ham 27 msbuild

我正在写一个msbuild .targets文件,在其中我想使用zip任务压缩一些我知道相对于.targets文件位置的文件.

当我直接执行.target文件时,这可以正常工作.但是,当我将.targets文件包含在另一个目录中的.proj文件中时,相对路径将相对于.proj文件而不是.targets文件进行解析.

有没有办法可以指定相对于我写的文件的相对路径?


我见过这个相关的问题:

如何在msbuild文件中给出相对路径?


我想到的解决方法是执行以下操作.我还没有尝试过.它会起作用吗,有更好的方法吗?

my.proj

<Import Project="..\Somewhere\my.targets"/>
<PropertyGroup>
   <MyTargetsYouAreHere>$(MSBuildProjectDirectory)\..\Somewhere</MyTargetsYouAreHere>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

my.targets

<Message Text="my.targets is here '$(MyTargetsYouAreHere)'" />
Run Code Online (Sandbox Code Playgroud)

Say*_*imi 61

处理文件时MSBuild的工作方式是读取所有文件,并在所有这些文件的内存表示中创建一个文件.这一切都发生在任何目标执行之前.因为当目标执行时,它没有包含它的文件的概念.基本上你将无法在.targets文件中使用相对路径.处理这种情况的方法是确保您的外围.proj文件(或您使用的任何扩展名)声明.targets文件用于解析共享文件的完整路径的已知属性.

例如

Sample.targets

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

</Project>
Run Code Online (Sandbox Code Playgroud)

Build.proj

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

    <Import Project="..\..\..\Sample.targets"/>
</Project>
Run Code Online (Sandbox Code Playgroud)

在相关的说明中,我讨论了在可重复使用的MSBuild脚本:验证元素的同时在我的博客上验证这样的"共享"属性.

MSBuild v.4.0及以上版本

如果您使用的是MSBuild 4.0(或更高版本),即Visual Studio 2010/.NET 4.0(也可以是.NET 2.0/3.0/3.5).然后,您现在拥有可用于此特定目的的这些属性:

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot