Подтвердить что ты не робот

Получить папку пакета NuGet в MSBuild

Я хочу вызвать исполняемые инструменты, такие как NUnit, которыми я управляю через 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 script. Это неприемлемо.

MSBuild не разрешает подстановочные знаки в каталогах, поэтому это не работает:

ToolPath="$(PackagesDirectory)\NUnit.*\tools"

Как я могу вызвать инструменты в MSBuild без необходимости обновлять мою сборку script всякий раз, когда я обновляю пакет NuGet?

4b9b3361

Ответ 1

Вы можете использовать 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>