gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:29:17 24 4
gpt4 key购买 nike

我正在使用 Selenium 开发一套 UI 测试。该套件的运行时依赖项之一是 chromedriver.exe,我们希望通过 Selenium.WebDriver.ChromeDriver 使用它。 NuGet 包。

旧世界

导入此 NuGet 包时,以下行将注入(inject)到 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

还是我还遗漏了什么?

最佳答案

如果您在构建期间运行 Restore 和其他目标,您可能会因为 NuGet 修改磁盘上的 xml 文件或因为 NuGet 包导入的 MSBuild 文件未正确导入而得到意外结果。

关于msbuild - 我们应该如何在通过 msbuild PackageReference 使用 nuget 包的新世界中执行包构建目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53674627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com