在MSBuild 4.0中,最简单的方式如下:
$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)\your\path'))
即使脚本被嵌入到另一个脚本中<Import>
,该方法也可以工作;路径是相对于包含上述代码的文件的。
(整合自Aaron的答案以及Sayed的答案的最后一部分)
在MSBuild 3.5中,您可以使用ConvertToAbsolutePath任务:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="Test"
ToolsVersion="3.5">
<PropertyGroup>
<Source_Dir>..\..\..\Public\Server\</Source_Dir>
<Program_Dir>c:\Program Files (x86)\Program\</Program_Dir>
</PropertyGroup>
<Target Name="Test">
<ConvertToAbsolutePath Paths="$(Source_Dir)">
<Output TaskParameter="AbsolutePaths" PropertyName="Source_Dir_Abs"/>
</ConvertToAbsolutePath>
<Message Text='Copying "$(Source_Dir_Abs)" to "$(Program_Dir)".' />
</Target>
</Project>
相关输出:
Project "P:\software\perforce1\main\XxxxxxXxxx\Xxxxx.proj" on node 0 (default targets).
Copying "P:\software\Public\Server\" to "c:\Program Files (x86)\Program\".
如果你问我,这有点啰嗦,但它可以正常工作。这将相对于“原始”项目文件进行操作,因此,如果将其放置在<Import>
ed的文件中,它不会相对于该文件。
在MSBuild 2.0中,有一种方法不使用“..”解析,但它的行为与绝对路径完全相同:
<PropertyGroup>
<Source_Dir_Abs>$(MSBuildProjectDirectory)\$(Source_Dir)</Source_Dir_Abs>
</PropertyGroup>
$(MSBuildProjectDirectory) 是一个保留属性,它始终是包含此引用的脚本的目录。
这也将与“原始”项目文件相关,因此,如果放置在被 <Import>
导入的文件中,这将不是相对于该文件的。