在应该通过msbuild PackageReference使用nuget软件包的新世界中,我们应该如何执行软件包构建目标?

时间:2018-12-07 17:53:11

标签: msbuild visual-studio-2017 nuget selenium-chromedriver

我正在使用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/4013WontFix结尾。

还是我还缺少什么?

1 个答案:

答案 0 :(得分:1)

如果在构建过程中运行Restore和其他目标,则由于NuGet修改磁盘上的xml文件或由于NuGet软件包导入的MSBuild文件未正确导入而导致的意外结果。