我正在使用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
复制/发布到正确的位置。
全部为绿色。
新世界。
我在csproj文件中使用了与PackageReference
相同的NuGet软件包。凉。但是,该软件包的构建目标不再执行。参见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
结尾。
还是我还缺少什么?
答案 0 :(得分:1)
如果在构建过程中运行Restore
和其他目标,则由于NuGet修改磁盘上的xml文件或由于NuGet软件包导入的MSBuild文件未正确导入而导致的意外结果。