В MSBuild 4.0 самый простой способ заключается в следующем:
$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)\your\path'))
Этот метод работает, даже если скрипт <Import>
переведен в другой скрипт; путь относительно файла, содержащего вышеуказанный код.
(объединено с ответом Аарона , а также последней частью ответом Саида )
В 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>
ed, это не будет относительно этого файла.