如何从MSBuild项目文件运行当前版本的NuGet包可执行文件?

时间:2012-11-06 18:45:39

标签: msbuild path nuget

我已将xunit.runners包添加到解决方案中。当前版本是1.9.1,所以我在MSBuild项目文件中硬编码了可执行文件的路径:

<StartAction>Program</StartAction>
<StartProgram>$(MSBuildProjectDirectory)\..\..\Packages\xunit.runners.1.9.1\tools\xunit.gui.clr4.exe</StartProgram>
<StartArguments>"$(MSBuildProjectDirectory)\$(OutPutPath)$(AssemblyName).dll"</StartArguments>

(偏离主题:使用此配置,F5启动xUnit GUI运行程序,我可以调试特定的单元测试。)

我知道每次更新Nuget包时,我都会忘记更改路径。更改路径是一个小麻烦,因为我必须卸载项目,编辑文件,然后重新加载项目。

无论包的实际版本如何,我如何启动可执行文件?我可以在MSBuild中使用通配符在名为xunit.runners.*的文件夹中找到可执行文件,然后将其用作<StartProgram>元素中的属性吗?

编辑:

类似的东西:

<ItemGroup>
    <Runners Include="$(MSBuildProjectDirectory)\..\..\Packages\xunit.runners.*\tools\xunit.gui.clr4.exe" />
</ItemGroup>

将按照版本排序@(Runners)给我所有参赛者。我怎样才能得到其中一个,最好是最后一个?

2 个答案:

答案 0 :(得分:1)

对于过滤,您可以构建自定义任务。它甚至可以是内联http://msdn.microsoft.com/en-us/library/dd722601.aspx,你是否可以编写c#代码来循环遍历项目并选择正确的代码。然后,您可以在输出属性中公开所选路径,然后使用该属性设置StartProgram属性的值。

This question显示了一个自定义内联任务,它可以获取一个项目数组并对其进行处理。你可以从那里开始。

您需要在启动调试的目标之前运行的目标中使用此任务。

答案 1 :(得分:0)

fsimonazzi comment我最终得到了这个:

<PropertyGroup>
  <Package>$([System.IO.Directory]::GetDirectories("$(MSBuildProjectDirectory)\\..\\..\\Packages\\", "xunit.runners.*").GetValue(0))</Package>
  <StartAction>Program</StartAction>
  <StartProgram>$(Package)\tools\xunit.gui.clr4.exe</StartProgram>
  <StartArguments>"$(MSBuildProjectDirectory)\$(OutPutPath)$(AssemblyName).dll"</StartArguments>
</PropertyGroup>

显然,NuGet将保证只有一个版本的包。