我正在开发一套使用Selenium的UI测试。这个套件的一个运行时依赖项是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
. 显然,这是故意的。
我可以手动导入目标,但问题是我必须硬编码包还原的位置。它不再恢复到解决方案的packages目录中,而是在我的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
.
还是我还缺什么?