代码之家  ›  专栏  ›  技术社区  ›  mark

在通过msbuild packagereference使用nuget包的新世界中,我们应该如何执行包生成目标?

  •  0
  • mark  · 技术社区  · 6 年前

    我正在开发一套使用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 .

    还是我还缺什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Martin Ullrich    6 年前

    如果你在跑步 Restore 以及其他目标,在生成过程中,由于nuget修改了磁盘上的XML文件或nuget包导入的msbuild文件未正确导入,您可能会得到意外的结果。