Как мы должны выполнять цели сборки пакетов в новом мире, где пакеты nuget потребляются через msbuild PackageReference? - PullRequest
0 голосов
/ 07 декабря 2018

Я разрабатываю набор тестов пользовательского интерфейса с использованием Selenium.Одной из зависимостей во время выполнения этого пакета является chromedriver.exe, который мы должны использовать в пакете Selenium.WebDriver.ChromeDriver NuGet.

Старый мир

Когда этот пакет NuGet импортируется, в файл csproj вставляются следующие строки:

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('..\packages\Selenium.WebDriver.ChromeDriver.2.44.0\build\Selenium.WebDriver.ChromeDriver.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Selenium.WebDriver.ChromeDriver.2.44.0\build\Selenium.WebDriver.ChromeDriver.targets'))" />
</Target>
<Import Project="..\packages\Selenium.WebDriver.ChromeDriver.2.44.0\build\Selenium.WebDriver.ChromeDriver.targets" Condition="Exists('..\packages\Selenium.WebDriver.ChromeDriver.2.44.0\build\Selenium.WebDriver.ChromeDriver.targets')" />

И это выполняется Visual Studio автоматически.Это распространяется на наши базы, обеспечивая, чтобы цели сборки, предоставляемые пакетом Selenium.WebDriver.ChromeDriver, были на момент сборки и запускались по мере необходимости.Логика внутри файла назначения сборки копирует / публикует chromedriver.exe в нужное место.

Все зелено.

Новый мир.

Я использую тот же пакет NuGet, что и PackageReference в файле csproj.Здорово.Однако цели сборки этого пакета больше не выполняются.См. https://github.com/NuGet/Home/issues/4013. По-видимому, это специально.

Я мог бы импортировать цели вручную, но проблема в том, что мне придется жестко кодировать место, где восстанавливается пакет.Он больше не восстанавливается в каталоге пакетов в решении, но в моем профиле Windows.Но нет никакого свойства, указывающего на это местоположение, и жесткое кодирование это отстой.

Итак, вот версия, которая работает для меня, и я ненавижу ее:

<PropertyGroup>
  <MyPackagesPath>$(UserProfile)\.nuget\packages\</MyPackagesPath>
  <SeleniumWebDriverChromeDriverTargets>$(MyPackagesPath)selenium.webdriver.chromedriver\2.44.0\build\Selenium.WebDriver.ChromeDriver.targets</SeleniumWebDriverChromeDriverTargets>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="2.44.0" />
</ItemGroup>

<Target Name="EnsureChromeDriver" AfterTargets="PrepareForRun">
  <Error Text="chrome driver is missing!" Condition="!Exists('$(OutDir)chromedriver.exe')" />
</Target>
<Import Project="$(SeleniumWebDriverChromeDriverTargets)" Condition="Exists('$(SeleniumWebDriverChromeDriverTargets)') And '$(ExcludeRestorePackageImports)' == 'true'" />

В целом, стиль Sdkпроекты просто великолепны, но весь этот процесс запуска целей из пакетов полностью нарушен, даже если он задуман.

Что мне не хватает?

РЕДАКТИРОВАТЬ 1

Итак, вот содержимое сгенерированного obj\UITests.csproj.nuget.g.targets:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
  </PropertyGroup>
  <ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
    <Import Project="$(NuGetPackageRoot)selenium.webdriver.chromedriver\2.44.0\build\Selenium.WebDriver.ChromeDriver.targets" Condition="Exists('$(NuGetPackageRoot)selenium.webdriver.chromedriver\2.44.0\build\Selenium.WebDriver.ChromeDriver.targets')" />
  </ImportGroup>
</Project>

Обратите внимание на условие ImportGroup '$(ExcludeRestorePackageImports)' != 'true'.Теперь это условие всегда false, потому что ExcludeRestorePackageImports кажется жестко закодированным, чтобы быть true в

c:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\NuGet\NuGet.targets

Проверка двоичного журнала подтверждает это.Плюс https://github.com/NuGet/Home/issues/4013 был закрыт как WontFix.

Или я все еще что-то упустил?

1 Ответ

0 голосов
/ 09 декабря 2018

Если вы используете Restore и другие цели во время сборки, вы можете получить неожиданные результаты из-за изменения XML-файлов NuGet на диске или из-за того, что файлы MSBuild, импортированные пакетами NuGet, импортированы неправильно.

...