2012-07-29 117 views
12

我想打电话给像NUnit的可执行工具,我的MSBuild通过的NuGet管理:获取NuGet包文件夹中的MSBuild

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

我如何可以调用工具的MSBuild,而不必每当我更新NuGet包来更新我的构建脚本?

回答

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

是“$(PackagesDirectory)”的项目你自己定义的? – 2015-08-05 02:54:01

+0

@DavidTchepak是的。 – 2015-08-05 13:12:48

+0

如果解决方案很大并且包含相同包的多个版本(由不同项目使用)会怎样?在这种情况下,您可能会引用错误的版本(即不是您项目的“packages.config”文件中指定的版本)。 – johnnyjob 2016-09-26 08:21:44

相关问题