在VSTS中发布*.snupkg符号包到私有Feed

15

我想使用VSTS构建工具打包并发布基于.NET标准的代码,生成NuGet包和符号包到我的私有NuGet源(在VSTS Artifacts中创建)。

我尝试使用dotnet CLI任务来构建和发布,但是它只会将.nupkg发布到NuGet源中,而不是*.snupkg。

我已经搜索了很多关于发布到nuget.org的文章,但没有找到与发布到私有源相关的信息。

4个回答

11
将*.snupkg符号包发布到VSTS的私有feed
您可以将.snupkg符号包发布到NuGet.org或任何选择此体验的NuGet服务器。但是,Azure DevOps私有feed没有此体验。
您可以从此wiki NuGet Package Debugging & Symbols Improvements中获取详细信息:
当发布软件包时,符号包和.nupkg都将轻松发布到NuGet.org或任何选择此体验的NuGet服务器。
原因:
众所周知,当我们在Visual Studio中使用.snupkg时,在符号文件(.pdb)位置下添加了一个新的符号服务器位置:

enter image description here

但是Visual Studio只能直接解析符号文件(.pdb),而不能解析.snupkg包,因此我们需要一个NuGet服务器来帮助我们从.snupkg包中读取.pdb文件。Azure DevOps Feed更倾向于成为共享软件包的存储库。
因此,我们必须将*.snupkg符号包发布到NuGet.org或任何选择此体验的NuGet服务器
如果您不想在nuget.org上分享您的软件包,您可以托管自己的NuGet服务器或使用轻量级解决方案来解决此问题(您可以使用私有Feed调试NuGet软件包)。
希望这可以帮助您。

感谢您提供的解决方案。我能否将 .nupkg 文件发布到 *.pkgs.visualstudio.com,将 .snupkg 文件发布到 nuget.org,以便使用相同的 NuGet 包代码? - Pradeep
另外,使用 *.snupkg 与使用 VSTS 符号服务器 (使用发布符号构建任务) 处理 NuGet 包的 .pdb 文件有什么区别? - Pradeep
1
*.snupkg 用于调试 NuGet 包,VSTS 符号服务器用于发布调试符号。一般来说,前者用于直接调试 NuGet 包,后者用于发布符号文件。 - Leo Liu

6

您可能希望将符号PDB直接嵌入主 NuGet 包中。在我看来,这是目前最好的做法 - 这样做更简单,完全消除了使用符号服务器的需要,并且适用于所有仓库类型,包括私有 VSTS/Azure DevOps feeds 和公共仓库。唯一的缺点是,即使客户端不使用调试信息,它们也必须下载稍大一些的 NuGet 包,但这似乎是次要的。

将 PDB 添加到 NuGet 包中通常只需将以下内容添加到项目文件中:

<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>

请查看NuGet #4142将pdb文件包含在我的nuget(nupkg)文件中


更新:我最近发现了一个重要的注意事项,关于我上面的回答。当PDB文件在NuGet中与.NET Core项目(非Framework)一起时,默认情况下VS无法找到它们(这是一个bug:https://github.com/dotnet/sourcelink/issues/628)。 在.NET7+中,您可以在使用的项目中将CopyDebugSymbolFilesFromPackages设置为true,以允许VS找到PDB文件(请参阅https://github.com/dotnet/sdk/pull/27580),但默认情况下未启用此功能。因此,如果消费者知道这个额外的步骤,嵌入式PDB文件可以工作,但是单独发布PDB文件会更加顺畅。 - Bret Johnson - MSFT

4
Azure Artifacts目前不支持 .snupkg 文件,但是它有一个符号服务器,如果您正在使用Azure管道构建,则可以将其发布到该服务器。此文档通过设置发布符号的管道来演示操作步骤:This doc

1
实际上,您可以将 snupkg 文件发布到 Azure Artifacts - 只是无法在调试时使用它们(截至目前为止)。 - MercifulGiraffe
我稍微更新了答案。你是正确的,你可以发布.snupkgs到服务上,它们将被接受。然而,在VS中不能用于调试,并且它们也会“占用”你的nupkg使用的软件包名称/版本,因此你将无法发布它,因此也无法共享你想要共享的位。 - Alex Mullans
我们目前正在将nupkg和snupkg文件推送到Azure DevOps,但并没有看到您所说的包名称/版本上的“蹲点”现象。不确定为什么我们的经验与您不同! - MercifulGiraffe
@AlexMullans 默认行为是创建一个symbols.nupkg文件而不是.snupkg。这会导致您看到的蹲点行为。 - Matthew Steeples
根据SourceLink文档所述,符号包“不受Azure DevOps Artifacts服务支持”。 - JamesQMurphy

3
您可以将snupkg文件发布到Azure DevOps,但目前无法在VS中使用它们进行调试。以下是我完成此操作的步骤:
1)设置“使用.NET Core”任务以升级.NET SDK版本,以支持此功能(如下所示)。

SDK install

2)设置自定义的dotnet pack命令(如下所示)

pack command

3) 使用 dotnet push 命令将其推送到 Azure(如下所示)

dotnet push setup

这将导致 snupkg 被推送到 Azure DevOps Artifacts,从而:

result


我成功地实现了这一点,但是在 AzureDevops Artifacts 中查看构件时,似乎没有可用的符号。你在推送后是否成功使用它们? - Jo Ham
@JoHam 我最近没有尝试过,但当我发布这个答案时,Azure DevOps 并没有将工件库识别为有效的符号位置。据我所知,这还有一段路要走。 - MercifulGiraffe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接