繁体   English   中英

相同的解决方案在不同的机器上产生不同的 Nuget package output

[英]Same solution on different machines producing different Nuget package output

我需要帮助。

我的项目最近已从 .NET Framework 4.8 迁移到 .NET 6。我们提升并编译了所有内容,包括从 packages.config 迁移到 PackageReference。

这个项目有点独特,因为它有:

  1. 一个面向外的 Git 存储库,可以连接到 inte.net
  2. 离线的私有 Git 仓库

这意味着我们有两个构建,一个用于每个存储库。 为此,我们必须将代码和 Nuget 包从面向外部的 Git 存储库复制到私有 Git 存储库。 显然,我们只想复制所需的 Nuget 包,因为使用私有 Git 存储库的系统上已经存在一些包(例如,.NET 6 包、DevExpress 包等)。

这就是问题所在。

当我在笔记本电脑上从 Visual Studio 构建解决方案时,全局包文件夹包含204 个包。 当我在我们的公共构建系统上使用 Visual Studio 中的完全相同的解决方案时,全局包文件夹包含125 个包。 无论面向外的系统如何,包裹的总数应该是相同的,而且对于我的生活,我无法弄清楚为什么会发生这种情况或如何解决它。

我们在解决方案文件夹中有一个 NuGet.config 文件(内容如下)。 我使用启用了诊断 output 的 Visual Studio 进行构建,并验证了完全相同的 NuGet 配置文件被引用并且在我的笔记本电脑和公共构建系统之间具有相同的内容。 这会让我相信在公共构建系统上安装了从其安装位置引用的软件(也许是 Visual Studio 组件?),但我的笔记本电脑不得不从 package 来源之一中提取它们。 我根本不知道它还能是什么,但我看不出这方面有什么不同。

谁能建议要调查的事情?

这是我们本地的 NuGet.config 文件内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="globalPackagesFolder" value=".\packages" />
    <add key="dependencyVersion" value="Highest" />
  </config>
  <packageSources>
    <clear />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
  <packageRestore>
    <clear />
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
  <bindingRedirects>
    <clear />
    <add key="skip" value="False" />
  </bindingRedirects>
  <packageManagement>
    <clear />
    <add key="format" value="1" />
    <add key="disabled" value="False" />
  </packageManagement>
</configuration>

(我知道这不是答案,但评论太长了......希望它能随着我们了解更多而发展)

关于在哪里寻找差异的几个想法:

  1. 在每个项目的 obj 文件夹中找到 project.assets.json 文件并在构建之间进行比较。 这将显示 NuGet 生成的还原图中的任何差异。
  2. 使用 /bl 标志从每个构建生成二进制日志 (binlog)(例如do.net build -blmbuild /bl ,具体取决于您的构建)。 使用https://msbuildlog.com/读取二进制日志。 您可以在每个项目构建中找到参考,并比较它们(更多手动,但可以对每组参考进行排序,然后在文本编辑器中复制和比较)。 这可能有助于显示某些引用是否来自安装位置。 一个起点可能是搜索$rar (这是$task ResolveAssemblyReferences的快捷方式),然后查看不同的 OutputItems、展开和排序。
  3. 比较在命令行上与在 Visual Studio 中构建的结果。 如果 VS 正在做一些事情来干扰或更改构建,这可以帮助隔离。

问题是 .NET 6 SDK 没有安装在我们的公共构建系统上。 让我看看我能不能解释一下。

直到 2022 年 11 月,我们只针对 .NET 框架,因此我们在升级 Visual Studio 时从来没有理由安装 .NET SDK。 11 月下旬,我们团队的一些成员开始使用我们已经安装的 Visual Studio 版本(我相信是 17.2.9)将我们的解决方案升级到 .NET 6。 显然,他们必须在本地系统上安装 .NET 6 SDK 才能在本地构建。 目前尚不清楚他们是在本地更新了 Visual Studio 版本还是直接下载了 .NET 6 SDK。

无论如何,假期过后,我开始着手更新我们的构建系统。 我做的第一件事就是在我的笔记本电脑、我们的公共构建系统和我们的各种离线系统上将 Visual Studio 更新到 v17.4.4。 我确保检查了单个组件页面上的 .NET SDK 选项。 我假设这在这些系统上安装了 .NET 6 SDK。

我错了。

Visual Studio 17.4.4 提供了 .NET 7 SDK,但我们特别针对 .NET 6,因为它是长期支持版本。

在我努力的某个时刻,我显然已经在我的笔记本电脑上下载并安装了 .NET 6 SDK,但未能建立连接,这也需要在其他系统上完成。

因此,在我的笔记本电脑上构建正确地提取了 .NET 6 个包 (204)。 在公共构建系统(没有.NET 6 SDK)上,构建导致从 inte.net 和本地 .NET 7 SDK (125) 中提取了一批软件包。

在公共构建系统上安装 .NET 6 SDK 后,它提取了我期望的 204 个包。

非常感谢吉米的建议。 我希望在他的回答和这个回答之间,其他人可能会从中受益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM