在MSBuild中获取NuGet包文件夹

在MSBuild中获取NuGet包文件夹,msbuild,build-automation,nuget,nuget-package,Msbuild,Build Automation,Nuget,Nuget Package,我想调用NUnit之类的可执行工具,我在MSBuild中通过NuGet管理这些工具: <Target Name="Test"> <CreateItem Include="$(BuildCompileDirectory)\*.Tests.*dll"> <Output TaskParameter="Include" ItemName="TestAssemblies" /> </CreateItem> <NUnit As

我想调用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>
如何在MSBuild中调用工具,而不必在更新NuGet软件包时更新生成脚本?

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

<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”文件中指定的版本)。在MsBuild 15中,您可以使用
PackageReference
GeneratePathProperty=“true”
。请参阅。
<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>