2012-07-29 131 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

相關問題