我想调用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>
问题是NuGet包的文件夹包含包的版本号。例如,nunit-console.exe
位于文件夹packages\NUnit.2.5.10.11092\tools
中。如果我更新NUnit包,这个路径将会改变,我必须更新我的MSBuild脚本。这是不可接受的。
MSBuild不允许在目录中使用通配符,因此这不起作用:
ToolPath="$(PackagesDirectory)\NUnit.*\tools"
每当我更新NuGet包时,如何在不更新构建脚本的情况下调用MSBuild中的工具?
答案 0 :(得分: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>