在MSBuild中获取NuGet包文件夹

15

我想在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中的工具?


2
在 MsBuild 15 中,您可以使用 PackageReferenceGeneratePathProperty="true"。请参见 https://www.patriksvensson.se/2019/09/how-to-find-a-nuget-package-path-from-msbuild。 - Mike Rosoft
2个回答

13

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

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

5
"$(PackagesDirectory)" 是你自己定义的项目吗? - David Tchepak
@DavidTchepak 是的,没错。 - Martin Buberl
如果解决方案很大,并且包含同一软件包的多个版本(由不同项目使用),该怎么办?在这种情况下,您可能会引用错误的版本(即不是指定在项目的“packages.config”文件中的版本)。 - johnnyjob
你也可以使用 $(NuGetPackageRoot) 宏。https://dev59.com/0FgQ5IYBdhLWcg3wvGi4#57048513 - ofthelit

3
Mike Rosoft 的评论链接到 Patrik Svensson 的博客,以下是它帮助我的方法:
  • GeneratePathProperty="true" 添加到您想要知道位置的 NuGet 包的 PackageReference 中。
  • 使用 $(PkgPackage_Name) 作为名称,其中点被下划线替换。请注意前缀Pkg

此示例强制 Nswag 使用 32 位 dotnet.exe 覆盖现有的 NSwagExe_Net60 属性。这在 x86 项目上是必需的。

  <PropertyGroup>
    <NSwagExe_Net60>"$(MSBuildProgramFiles32)\dotnet\dotnet.exe" "$(PkgNSwag_MSBuild)\tools\Net60\dotnet-nswag.dll"</NSwagExe_Net60>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="NSwag.MSBuild" Version="13.16.1" GeneratePathProperty="true">
  </ItemGroup>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接