dotnet pack 项目参考

Posted

技术标签:

【中文标题】dotnet pack 项目参考【英文标题】:dotnet pack project references 【发布时间】:2017-10-25 23:27:09 【问题描述】:

我非常喜欢跨几个程序集分离功能,例如数据提供者的外观、数据提供者的合同和数据提供者实现本身......在我看来,它可以很容易地对单个组件进行单元测试一个功能,并且在未来很容易换出一个东西(在我的例子中,它使数据提供者很容易换出)。

如果我创建一个包含 3 个项目的解决方案并使用项目引用,则当我在条目程序集上进行 dotnet-build 时,所有引用都将复制到输出文件夹。当我 dotnet 打包入口程序集项目以创建 NuGET 包时,NuGET 程序包中仅包含入口程序集(不是合同或数据提供者)

这似乎是设计使然; .NET Core dotnet-pack 的 documentation 声明

项目到项目的引用未打包在项目中。 目前,如果您有项目到项目的依赖关系,则每个项目都必须有一个包。

我的问题是 - 为什么会这样?如果我想将我的代码分成逻辑程序集,我不得不创建单独的 NuGET 包并引用它们,或者只是将我的所有代码集中到一个程序集中。有没有办法在 NuGET 包中包含项目引用?

我使用的是 VS2017 / .NET Core v1.1(csproj,不是 xproj)

【问题讨论】:

至于“为什么”,当文档说您“当前”必须做某事时,通常意味着开发人员没有时间实现该功能。 @svick 哦,这很愤世嫉俗(但可能是对的!)我将把这篇文章打开一段时间,以防出现某种方式解决 1 程序集/NuGET 包的限制不久的将来。 【参考方案1】:

实现所需的一种可能方法是使用自定义 .nuspec 文件,您可以在其中指定要打包的 dll

<PropertyGroup>
    <NuspecFile>App.nuspec</NuspecFile>
</PropertyGroup>

有了这个,dotnet pack 将生成与MyPackage.nuspec 相关的包。

此外,如果您有 3 个具有合同和实施的项目,并且您不想添加 3 个包引用,则可以创建一个元包,仅将这 3 个作为依赖项并引用该单个元包。

【讨论】:

这不能回答我的问题,恕我直言,你错过了我的观点。我不提倡不使用包;相反,我在谈论创建可维护的包。如果我有一个包用于做一些简单的事情,比如将文件写入缓存,我喜欢将(该包的)各个组件分离到它们自己的程序集中(业务逻辑/数据访问/两者之间的合同)。它比在单个 dll 中创建一个包含所有内容的巨大包要干净,而且您可以使用 TDD 轻松构建。包中的未来更改也不会那么麻烦。 nuget 包的各个部分并不是独立包的理想选择,但我不得不创建独立包或整体 dll。 是我的问题。 我从没想过你提倡不使用包装。您的问题是关于开箱即用的“每个包的 Dll”设计而不是“每个包的 Dll 和依赖项”的目的。您正在谈论创建可维护的包,我也是如此。“每个包的 Dll”方法允许您单独维护应用程序的每个部分,尽管您仍然可以选择创建自定义包。 您不必将所有逻辑都放在一个 Monolithic.dll 中。 NuGet 包是一个简单的 zip 文件(扩展名为 .nupkg),允许您存储任意数量的文件。 重新阅读后,如果您要删除帖子的整个前半部分,我可能会接受这个作为答案,描述您对为什么这是一个坏主意的看法,并留下一点在那回答了问题(以'关于问题......'开头的位)。那只是因为目前的答案结构导致我误解了你的答案,我相信这也会导致其他可能有同样问题的人也误解你的答案。

以上是关于dotnet pack 项目参考的主要内容,如果未能解决你的问题,请参考以下文章

dotnet pack 不适用于 Azure Function(Pack Azure Functions for Nuget)

使用“dotnet pack”时“PackageVersion”无效

Eclipse创建项目c#提示找不到'dotnet'的命令路径

ASP.NET Core分布式项目实战Docker制作dotnet core控制台程序镜像

在 Arch linux 中从终端创建 dotnet(.Net) 项目时出错

dotnet发布命令不适用于aws buildspecs.yml文件中的asp dotnet项目