如何';DNU恢复';确定依赖项是项目引用还是包引用

本文关键字:引用 包引用 项目 依赖 恢复 DNU 如何 | 更新日期: 2023-09-27 18:28:45

在asp.net 5.0中,"项目"与"包"(即Nuget包)的引用让我的内裤陷入了困境。我真的希望有人能更全面地解释一下在asp.net 5.0中引入引用的方式。"dnu还原"如何确定某个内容是否是项目引用而不是包引用?

我曾想过,如果项目在同一目录中,引用会被作为一个项目引入,但这显然不是故事的全部。看起来,您可以有一个更深层次的目录嵌套,并且仍然可以获取项目引用。

以下是我的通用项目结构的概要:

我有一套项目,其中一些项目相互参照。有名为TextHelpers和MathHelpers的库,还有一个名为MainProject的项目。库位于名为libraries的文件夹中,MainProject位于名为Tools的文件夹中。这种分离是必要的,因为库和工具属于不同的Git-reso:

  • Root/Libraries/TextHelpers.Project1-版本1.0.0-*
  • Root/Libraries/TextHelpers.Project2-版本1.0.0-*
  • Root/Libraries/MathHelpers.Project1-版本1.0.0-*
  • Root/Libraries/MathHelpers.Project2-版本1.0.0-*
  • Root/Tools/MainProject-版本1.0.0-*

通常MainProject将库引用为来自为库提供服务的私有Nuget存储库(只是文件系统上的一个文件夹)的Nuget包。

然而,当我构建MainProject时,有时我需要对其中一个库项目进行更改,或者有时我想在不使用Nuget符号服务器的情况下进入文件。出于这个原因,我想切换到引用(实时)项目,而不是从(静态)Nuget包。我该怎么做?

到目前为止,我已经发现了很多:如果我有一个global.json文件,"dnu restore"会创建一个带有"project"而不是"package"引用的project.lock.json。这就是整个故事吗?

如何';DNU恢复';确定依赖项是项目引用还是包引用

dnudnx在以下文件夹中查找:

  1. 当前项目所在的文件夹(即包含当前项目的project.json的文件夹的父文件夹)。例如,如果您有repo/src/project1/project.json,它将在repo/src中查找
  2. global.json中包含的任何其他文件夹

那么这个算法真的很天真:如果它在上面提到的任何文件夹中找到一个名称与包匹配的文件夹,它就会认为这些是该包的来源。

例如,如果你有

src/P1/project.json
src/System.Collections/project.json

src/P1/project.json中,您有一个对System.Collections的引用,它将使用src/System.Collection而不是NuGet包System.Collections。项目优先于包。

注意事项:

  1. 由于算法在当前文件夹和global.json中的所有内容中查找,您可能能够引用一个文件夹中的一些项目,但不能引用另一个文件夹。如果在我之前的示例中,您添加了一个test/T1/project.json项目,但src不在global.json中,那么src中的项目将引用System.Collections项目,而T1将引用包(安装在全局包文件夹中)
  2. 没有验证项目引用是否真的是那个包。如果名称匹配,则为匹配。因此,一个空项目可以取代任何包
  3. 如果你有多个同名的项目,你可能会遇到麻烦

希望这能帮助并回答您的问题。

附带说明:使用dotnet(取代dnx的工具),如果您希望项目或包具有更高的优先级,则可以为每个引用指定。