nuget.dgspec.json 文件的用途是什么?

问题描述 投票:0回答:1

本地存储库服务器隔离了某些软件包。由于 nuget 恢复从存储库中选择了 dotnet 运行时 6.0.18,由于该软件包的隔离,nuget 恢复始终失败....,我尝试将运行时版本指向较低的版本像 6.10 这样的版本可以避免这种失败。我不知道它是从哪里选择运行时版本来选择 dotnet 运行时包....它几乎坚定地反复选择 6.18。我认为罪魁祸首是 obj 下的 nuget.dgspec.json 。但它们似乎是恢复运行时在临时文件夹中创建的临时文件...没有必要编辑临时条目...这是指向 nuget 恢复所需的运行时版本的最佳方法?

c# .net msbuild nuget nuget-package-restore
1个回答
0
投票

这是 NuGet 在恢复时写入的文件,代表该项目的所有 NuGet 项目输入。因此,无论您在其中看到什么值,都是因为其他东西告诉 NuGet 这就是项目想要的。

如果您在 Visual Studio 中使用解决方案筛选器,或者以其他方式“卸载”项目,则会读取该信息。它使 NuGet 能够将具有

<ProjectReference
的已加载项目恢复到已卸载的项目。 NuGet 也有可能在使用
-p:RestoreRecursive=false
的 CLI 恢复上读取它,但我对此没有信心。我认为在 CLI 恢复上,即使禁用递归,我认为它仍然通过 MSBuild 递归获取项目输入,它只是不会为其他项目恢复(生成所有 NuGet 的
obj/*
文件)。如果您没有在 VS 中使用已卸载的项目,则永远不会读取 dgspec 文件。

无论如何,如果您给出您所指的包的示例,您的问题会更清楚。特别是因为“隔离”是一个通用英语单词,而不是 .NET 软件开发中常用的术语。我猜您有一些安全工具可以扫描具有已知漏洞的软件包。

无论如何,鉴于您提到了运行时和版本号,听起来很像 .NET 运行时版本号,我认为它是 .NET SDK 自动(隐式)添加的包。可能是 .NET 主机包。因此,您需要将主机上的 .NET SDK 版本升级到最新版本,然后 .NET SDK 就会在 SDK 发布时知道使用最新版本的包。

另一个选择是安装与项目目标目标框架的相同主要版本相匹配的 .NET SDK。您提到的版本 6.0.something,因此您的项目必须具有

<TargetFramework>net6.0
,但您的 CI 代理必须安装 .NET 7 SDK(或 .NET 8 预览版/RC)。

.NET SDK 包含与 SDK 相同(主要)运行时版本的运行时主机(因此 .NET 7 SDK 预装了 .NET 7 运行时主机包)。您可能还需要使用

global.json
将您的存储库固定到该版本的 .NET SDK,因为如果您安装了旧的 .NET 7 SDK,并且安装了较新版本的 .NET 6 SDK,那么运行时主机.NET 6 SDK 可能与旧版 .NET 7 SDK 期望的 .NET 6 运行时主机版本不同,因此仍然告诉 NuGet 下载包。

如果您想提高 MSBuild 调试技能,只需学习一种工具:在命令行上运行任何 MSBuild 命令,并添加

-bl
参数。它将向当前目录写入一个文件
msbuild.binlog
,然后您可以使用https://msbuildlog.com打开它。有一个 Windows 应用程序可以下载,或者直接在网站上查看 binlog。

它显示了 MSBuild 所做的一切的痕迹,您可以通过查看来了解发生了什么。您还可以右键单击项目并选择“预处理”以查看所有

<Import
展开的项目文件。与任何新事物一样,它需要一些时间来理解,但随后您将能够调试几乎所有构建问题。请确保不要开始编写其他人无法理解的复杂 MSBuild 脚本,除非他们也成为 MSBuild 专家

© www.soinside.com 2019 - 2024. All rights reserved.