c# – ‘DNU RESTORE’如何确定依赖项是项目引用而不是包引用?

我正在使用asp.net 5.0中的’project’与’package'(即Nuget包)引用来改变我的短裤.我真的希望有人能够更全面地解释asp.net 5.0中引用的方式. ‘dnu restore’如何确定某个东西是项目引用而不是包引用?

如果项目位于同一目录中,我原以为引用会作为项目被引入,但这显然不是全部.看起来您可以拥有更深层次的目录嵌套并仍然可以获取项目引用.

以下是我常见项目结构的概述:

我有一组项目,其中一些项目相互引用.有一些名为TextHelpers和MathHelpers的库以及一个名为MainProject的项目.这些库位于名为Libraries的文件夹中,MainProject位于名为Tools的文件夹中.这种分离是必要的,因为库和工具属于不同的Git存储库:

> 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的工具),如果希望项目或包具有更高的优先级,则可以为每个引用指定.

点赞