在MSBuild中获取NuGet包文件夹

Mar*_*erl 12 msbuild build-automation nuget nuget-package

我想调用像NUnit这样的可执行工具,我在MSBuild中通过NuGet管理它:

<Target Name="Test">
  <CreateItem Include="$(BuildCompileDirectory)\*.Tests.*dll">
    <Output TaskParameter="Include" ItemName="TestAssemblies" />
  </CreateItem>
  <NUnit
    Assemblies="@(TestAssemblies)"
    ToolPath="$(PackagesDirectory)\NUnit.2.5.10.11092\tools"
    WorkingDirectory="$(BuildCompileDirectory)"
    OutputXmlFile="$(BuildDirectory)\$(SolutionName).Tests.xml" />
</Target>
Run Code Online (Sandbox Code Playgroud)

问题是NuGet包的文件夹包含包的版本号.例如nunit-console.exe在文件夹中packages\NUnit.2.5.10.11092\tools.如果我更新NUnit包,这个路径将会改变,我必须更新我的MSBuild脚本.这是不可接受的.

MSBuild不允许在目录中使用通配符,因此这不起作用:

ToolPath="$(PackagesDirectory)\NUnit.*\tools"
Run Code Online (Sandbox Code Playgroud)

如何更新NuGet包时,如何在不更新构建脚本的情况下调用MSBuild中的工具?

Mar*_*erl 12

您可以使用MSBuild Transforms获取特定工具的相对目录:

<ItemGroup>
  <NunitPackage Include="$(PackagesDirectory)\NUnit.*\tools\nunit-console.exe"/>
</ItemGroup>

<Target Name="Test">
  <CreateItem Include="$(BuildCompileDirectory)\*.Tests.*dll">
    <Output TaskParameter="Include" ItemName="TestAssemblies" />
  </CreateItem>
  <NUnit
    Assemblies="@(TestAssemblies)"
    ToolPath="@(NunitPackage->'%(relativedir)')"
    WorkingDirectory="$(BuildCompileDirectory)"
    OutputXmlFile="$(BuildDirectory)\$(SolutionName).Tests.xml" />
</Target>
Run Code Online (Sandbox Code Playgroud)

  • “ $(PackagesDirectory)”是您自己定义的项目吗? (2认同)