如何';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
和dnx
在以下文件夹中查找:
- 当前项目所在的文件夹(即包含当前项目的
project.json
的文件夹的父文件夹)。例如,如果您有repo/src/project1/project.json
,它将在repo/src
中查找 global.json
中包含的任何其他文件夹
那么这个算法真的很天真:如果它在上面提到的任何文件夹中找到一个名称与包匹配的文件夹,它就会认为这些是该包的来源。
例如,如果你有
src/P1/project.json
src/System.Collections/project.json
在src/P1/project.json
中,您有一个对System.Collections
的引用,它将使用src/System.Collection
而不是NuGet包System.Collections
。项目优先于包。
注意事项:
- 由于算法在当前文件夹和
global.json
中的所有内容中查找,您可能能够引用一个文件夹中的一些项目,但不能引用另一个文件夹。如果在我之前的示例中,您添加了一个test/T1/project.json
项目,但src
不在global.json
中,那么src
中的项目将引用System.Collections
项目,而T1
将引用包(安装在全局包文件夹中) - 没有验证项目引用是否真的是那个包。如果名称匹配,则为匹配。因此,一个空项目可以取代任何包
- 如果你有多个同名的项目,你可能会遇到麻烦
希望这能帮助并回答您的问题。
附带说明:使用dotnet
(取代dnx
的工具),如果您希望项目或包具有更高的优先级,则可以为每个引用指定。