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

如何获取当前msbuild文件的路径?,msbuild,Msbuild,我正在编写一个msbuild.targets文件,我想在其中使用zip任务来压缩一些我知道相对于.targets文件的位置的文件 当我直接执行.target文件时,这工作正常。但是,当我将.targets文件包含在另一个目录中的.proj文件中时,相对路径将相对于.proj文件而不是.targets文件进行解析 有没有一种方法可以指定与我写入的文件相关的相对路径 我看到了这个相关的问题: 我想到的一个解决方法是执行以下操作。我还没试过。这行得通吗,有更好的办法吗 我的项目 <Impo

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

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

有没有一种方法可以指定与我写入的文件相关的相对路径


我看到了这个相关的问题:


我想到的一个解决方法是执行以下操作。我还没试过。这行得通吗,有更好的办法吗

我的项目

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

$(MSBuildProjectDirectory)\..\
我的目标

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

处理文件时,MSBuild的工作方式是读取所有文件,并为所有这些文件创建一个内存表示形式。这一切都发生在执行任何目标之前。因此,当目标执行时,它不知道它包含在什么文件中。基本上,您将无法在.targets文件中使用相对路径。处理这种情况的方法是确保外围.proj文件(或使用的任何扩展名)声明.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>

$(MSBuildProjectDirectory)\\
在一个相关的笔记中,我在我的博客上讨论了验证这些“共享”属性

MSBuild v。4.0及以上 如果您使用的是MSBuild 4.0(或更高版本),即Visual Studio 2010/.NET 4.0(也可以针对.NET 2.0/3.0/3.5)。现在,您有了可用于此特定目的的:

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot