有没有办法在 Visual Studio 2019 中发布 .NET 标准库而不生成 .nupkg?

Posted

技术标签:

【中文标题】有没有办法在 Visual Studio 2019 中发布 .NET 标准库而不生成 .nupkg?【英文标题】:Is there a way to publish a .NET Standard Library without producing a .nupkg in Visual Studio 2019? 【发布时间】:2019-09-25 14:45:08 【问题描述】:

我的理解是,当您发布 .NET 标准库时,预期的行为是生成 .nupkg

我有内部的 .Net 标准库,我维护这些库用于内部项目。一个典型的工作流程是发布库,然后将发布的文件复制到使用项目。这不是我应该做的事情吗?我对发布 .NET 标准库时缺少选项感到有些困惑——因为有一个 .nupkg 而没有选择以不同的形式发布。

想要从发布中获得的只是发布目录中必要的库文件的集合(不在nupkg 中)。有没有办法做到这一点?

【问题讨论】:

.nupkg 文件只有一个目的,就是将其发布到 Nuget 服务器。这是明智的,但听起来不是你真正想做的。将库文件放入专用目录不需要 .nupkg,您只需更改项目的输出路径。只要确保你能在五年后将它们重新组合到一台新机器上。 我原本以为我需要做的就是构建项目。但这产生了一个非常意想不到的问题,我在这里询问:***.com/questions/58085571/… 这导致我尝试使用 Publish(我以前从未使用过)。但听起来发布也不是正确的方法。构建 .net 标准 DLL 并将所有依赖项复制到构建文件夹以便手动部署的正确工作流程是什么?不发布吗? 我知道这可能不适用于您的设置,但 FWIW - 如果您在本地开发多个项目,项目引用比引用构建的 DLL(或 nupkg)容易得多。 就像 Nate 建议的那样,如果你在本地开发它们,你可以添加项目引用来做。 (如果不是相同的解决方案,请先添加现有项目)。如果你想输出一个包含多个程序集的文件夹,并将该文件夹共享给其他人,你可能需要在 xx.csproj 中进行一些修改。同样正如我回答中的文档所说,The primary distribution vehicle for the .NET Standard reference assemblies is NuGet packages,然后当您发布它并获得 xx.nupkg 时,为了进一步开发,您可以轻松地将 xx.nupkg(一个 nuget 包)分享给其他人。它确实有一些优势。 .net 标准项目引用了哪些包的信息存储在 xx.nupkg 中的隐藏 xx.nuspec 文件中。您无需解压即可使用输出的project.dll,将xx.nupkg共享给其他人或本地其他项目的正确方法是通过Package Manager UI或Package Manager将xx.nupkg消耗到一个项目中VS 中的控制台,或在服务器中使用dotnet cli。由于依赖 ID 的信息存储在 xx.nupkg 中,这些包也会被安装。 【参考方案1】:

我的理解是,当您发布 .Net 标准库时, 预期的行为是生成 .nupkg。我想从中得到什么 发布只是发布中必要的库文件的集合 目录(不在 nupkg 内)。有没有办法做到这一点?

对于普通的 .net 框架项目,如果您引用一个 nuget 包并构建它。然后,您将获得一个包含 Project.dll 和 Package.dll 的输出文件夹(bin\debug 或 bin\release)。这就是你想要的。

但是对于.net standard项目,默认只会输出Project.dll。这也是预期的行为,请参阅comment1、comment2。这就是为什么我建议您需要手动编辑xx.csproj 以在构建期间获得预期的行为。这是设计使然,它不会将 nuget 依赖项复制到输出,this 是可能满足您需求的解决方法。

至于为什么右键项目节点时publish output is a xx.nupkg=>在VS IDE(.net标准项目)中发布,请查看this document:.NET的主要分发工具标准参考程序集是 NuGet 包。我认为这就是为什么 Publish 的输出是 xx.nupkg,很难说,但它可能是设计使然...

编辑:

有没有办法发布一个 .Net 标准库而不产生一个 Visual Studio 2019 中的 .nupkg?

如果您指的是 .net 标准项目的 发布 选项。(在解决方案资源管理器中右键单击 .net 标准项目的项目名称=>发布)。恐怕答案是否定的。此选项是设计使然,目前不支持像 publish a folder with all referenced assemblies 这样的其他选项。您可能需要添加Feature Request in DC。

希望我的澄清能有所帮助,如果我有任何误解,请随时纠正我:(

【讨论】:

【参考方案2】:

典型的工作流程是发布库,然后将发布的文件复制到使用项目。这不是我应该做的事情吗?

没有。这几乎是最糟糕的做事方式。

如果/因为您不使用本地生成的 Nuget 包,您应该使用 project references:

当您有一个生成程序集的项目时,您应该引用该项目而不是使用文件引用。项目到项目引用的优点是它在构建系统中的项目之间创建了依赖关系。

每个包含引用一个或多个内部库的项目的解决方案还应包含解决方案中的库(以及这些库引用的任何内部库)。

我将逐步完成创建一些一次性项目,但这些技术也适用于现有代码 - 您只需将它们添加到解决方案中,而不是创建新的:

针对 .NET Standard 2.0 创建 ClassLibrary1 向解决方案添加一个新项目:ClassLibrary2 面向 .NET Standard 2.0 让我们安装一个流行的 Nuget 包到ClassLibrary2:Newtonsoft.Json 在解决方案资源管理器中右键单击ClassLibrary1,单击Add,然后单击Reference。在项目选项卡中勾选ClassLibrary2 并单击确定。 ClassLibrary1 现在有一个对 ClassLibrary2 的项目引用,并且以下内容已添加到 ClassLibrary1.csproj
  <ItemGroup>
    <ProjectReference Include="..\ClassLibrary2\ClassLibrary2.csproj" />
  </ItemGroup>

添加一个 .NET 控制台应用项目,ConsoleApp1

ClassLibrary 的项目引用添加到ConsoleApp1

保存解决方案

使用发布配置构建解决方案

我们需要的一切都在控制台应用的 bin 文件夹中,而且看不到 Nupkg 文件夹:

1234563同样,文件夹树中的任何地方都没有 Nupkg。

但是,我们发布 .NET Core 应用程序。至少,我喜欢将我的 .NET Core 应用程序(供内部使用)发布为“自包含”。为此,我在解决方案资源管理器中右键单击 .NET Core 应用程序,单击Publish,然后选择Folder 作为目标。我点击Create Profile,然后点击Edit,将部署模式改为self-contained,然后保存。然后我发布应用程序(不是库)并在我的发布文件夹中获得我需要的所有文件,包括内部库和 .NET Core(不要'不用担心,Newtonsoft DLL 也在那里,只是在屏幕截图中看不到):

我获得构建 Nuget 包的唯一时间是:

如果我明确发布内部库,或者

如果我在项目文件中有&lt;GeneratePackageOnBuild&gt;true&lt;/GeneratePackageOnBuild&gt; [example]

如果您通过私有包源分发库,那么“Nuget 方式”是一种很好且有效的方法;但既然这不是你想要做的 - 不要发布库!取而代之的是项目引用,这意味着将库添加到使用它们的解决方案中

【讨论】:

以上是关于有没有办法在 Visual Studio 2019 中发布 .NET 标准库而不生成 .nupkg?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法查看一个 Visual Studio 项目有多少个文件?

有没有办法在 Visual Studio 中将 Outlook 项目保存为 pdf?

使用 C++ 在 Visual Studio 2019 中创建新的头文件?

NuGet 包地址失效处理办法-如何在 Visual Studio 2019 中安装 NuGet 包

NuGet 包地址失效处理办法-如何在 Visual Studio 2019 中安装 NuGet 包

NuGet 包地址失效处理办法-如何在 Visual Studio 2019 中安装 NuGet 包