我正在写一个msbuild .targets文件,在其中我想使用zip任务压缩一些我知道相对于.targets文件位置的文件。
当我直接执行.target文件时,这可以正常工作。但是,当我将.targets文件包含在另一个目录中的.proj文件中时,相对路径将相对于.proj文件而不是.targets文件进行解析。
有没有办法可以指定相对于我写的文件的相对路径?
我见过这个相关的问题:
How to give relative path in msbuild file?
我想到的解决方法是执行以下操作。我还没有尝试过。它会起作用吗,有更好的方法吗?
my.proj
<Import Project="..\Somewhere\my.targets"/>
<PropertyGroup>
<MyTargetsYouAreHere>$(MSBuildProjectDirectory)\..\Somewhere</MyTargetsYouAreHere>
</PropertyGroup>
my.targets
<Message Text="my.targets is here '$(MyTargetsYouAreHere)'" />
答案 0 :(得分:61)
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>
在相关说明中,我讨论了在Elements of Reusable MSBuild Scripts: Validation一段时间在我的博客上验证此类“共享”属性。
如果您使用的是 MSBuild 4.0 (或更高版本),即Visual Studio 2010 / .NET 4.0(也可以是.NET 2.0 / 3.0 / 3.5)。然后你现在有these properties可以用于这个特定目的:
MSBuildThisFile
MSBuildThisFileDirectory
MSBuildThisFileDirectoryNoRoot