MSBuild:将导入项目中的相对路径转换为绝对路径

时间:2010-06-11 08:08:41

标签: c# msbuild

简短版本:

我有一个导入另一个项目的MSBuild项目。在导入的项目中存在一个相对路径的属性,该路径相对于导入项目的位置。如何将此相对路径转换为绝对路径?我已经尝试过ConvertToAbsolutePath任务,但这使得它相对于导入项目的位置而言。)

长版:

我正在尝试使用Robert Koritnik的MSBuild任务将nunit输出集成到Visual Studio中(请参阅this其他SO问题以获取链接)。由于我喜欢在版本控制下使用我的所有工具,因此我希望其中包含自定义任务的目标文件使用相对路径指向nunit控制台应用程序。

我的问题是这条相对路径最终是相对于导入项目而来的。

E.g。 (在... MyRepository \ Third Party \ NUnit \ MSBuild.NUnit.Task.Source \ bin \ Release \ MSBuild.NUnit.Task.Targets):

...
  <PropertyGroup Condition="'$(NUnitConsoleToolPath)' == ''">
    <NUnitConsoleToolPath>..\..\..\NUnit 2.5.5\bin\net-2.0</>
  </PropertyGroup>  
...
  <Target Name="IntegratedTest">
    <NUnitIntegrated
      TreatFailedTestsAsErrors="$(NUnitTreatFailedTestsAsErrors)"
      AssemblyName="$(AssemblyName)"
      OutputPath="$(OutputPath)"
      ConsoleToolPath="$(NUnitConsoleToolPath)"
      ConsoleTool="$(NUnitConsoleTool)"
    />
  </Target>
...

上述目标失败,并显示无法找到文件的错误(即nunit-console.exe文件)。在NUnitIntegrated MSBuild任务中,当调用execute()方法时,当前目录是导入项目的目录,因此相对路径将指向错误的位置。

我尝试通过将这些任务添加到IntegratedTest目标来将相对路径转换为绝对路径:

<ConvertToAbsolutePath Paths="$(NUnitConsoleToolPath)">
  <Output TaskParameter="AbsolutePaths" PropertyName="AbsoluteNUnitConsoleToolPath"/>
</ConvertToAbsolutePath>

但这只是将其转换为相对于导​​入此目标文件的项目文件的目录。

我知道我可以使用属性$(MSBuildProjectDirectory)获取导入项目的目录,但找不到导入目录的任何等效项目标文件。

有人能告诉我导入文件中应该与导入文件所在目录相关的路径是如何绝对的吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

您必须使用MSBuildProjectDirectory

定义相对路径

导入项目

<PropertyGroup>
  <RelativePathToProject>subdir\</RelativePathToProject>
</PropertyGroup>

<Import Project="$(RelativePathToProject)SubSample.proj"/>

<Target Name="GetNUnitConsolePath">
  <Message Text="NUnitConsoleToolPath : %(NUnitConsoleToolPath.FullPath)"/>
</Target>

导入的项目文件:

<ItemGroup>
  <NUnitConsoleToolPath 
     Include="$(MSBuildProjectDirectory)\$(RelativePathToProject)..\..\..\NUnit 2.5.5\bin\net-2.0"/>
</ItemGroup>