【问题标题】:Get NuGet package folder in MSBuild在 MSBuild 中获取 NuGet 包文件夹
【发布时间】:2012-07-29 00:04:10
【问题描述】:

我想调用我通过 MSBuild 中的 NuGet 管理的 NUnit 等可执行工具:

<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>

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

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

ToolPath="$(PackagesDirectory)\NUnit.*\tools"

如何在更新 NuGet 包时调用 MSBuild 中的工具而无需更新构建脚本?

【问题讨论】:

标签: msbuild build-automation nuget nuget-package


【解决方案1】:

您可以使用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>

【讨论】:

  • “$(PackagesDirectory)”是您自己定义的项目吗?
  • @DavidTchepak 是的。
  • 如果解决方案很大并且包含同一个包的多个版本(由不同的项目使用)怎么办?在这种情况下,您可能会引用错误的版本(即不是您项目的“packages.config”文件中指定的版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多