Я разрабатываю набор тестов пользовательского интерфейса с использованием 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
.
Или я все еще что-то упустил?