【问题标题】:Publish *.snupkg symbol package to private feed in VSTS将 *.snupkg 符号包发布到 VSTS 中的私人订阅源
【发布时间】:2019-01-16 06:39:03
【问题描述】:

我想使用 VSTS 构建将基于 .net 标准的代码打包并发布为 nuget 包。我创建了一个私有 nuget 提要(在 VSTS Artifacts 中),我想将 nuget 包与符号包一起发布到该提要中。

我尝试使用 dotnet CLI 任务来构建和发布,但它只发布 .nupkg 而不是 *.snupkg 到 nuget 提要。

我用谷歌搜索了很多,但我只找到了与发布到 nuget.org 相关的文章,而不是与私人订阅源相关的文章。

【问题讨论】:

    标签: azure-devops nuget azure-pipelines azure-artifacts


    【解决方案1】:

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

    您可以将 .snupkg 符号包发布到 NuGet.org,或任何选择加入此体验的 NuGet 服务器。但是 azure devops 私人订阅源没有这种经验。

    你可以从这个wikiNuGet Package Debugging & Symbols Improvements获取详细信息:

    • 发布包时,符号包和 .nupkg 都可以轻松发布到 NuGet.org,或选择加入此体验的任何 NuGet 服务器。

    原因

    我们知道,当我们在 Visual Studio 中使用 .snupkg 时,我们会在符号文件 (.pdb) 位置下添加一个新的符号服务器位置:

    但是Visual Studio只能直接解析符号文件(.pdb)而不是.snupkg包,所以我们需要一个NuGet服务器来帮助我们从@读取.pdb文件987654330@ 包。 Azure devops feed 更倾向于成为包的共享存储库。

    因此,我们必须将 *.snupkg 符号包发布到 NuGet.org,或任何选择加入此体验的 NuGet 服务器

    如果您不想在 nuget.org 上共享您的包,您可以host your own NuGet server 或使用lightweight solution 来解决此问题(您可以使用私人提要调试 nuget 包)。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的解决方案。我可以将 .nupkg 文件发布到 *.pkgs.visualstudio.com 并将 .snupkg 文件发布到 nuget.org 以获得相同的 nuget 包代码吗?
    • 另外,使用 *.snupkg 和使用 VSTS Symbol Server(使用 Publish Symbol 构建任务)处理 nuget 包的 .pdb 文件有什么区别?
    • @Prado,恐怕你做不到。查看 wiki Symbols Package Requirements,“为确保上传的符号与上传的 .dll 完全匹配,我们正在与编译器团队合作,将从 .dll 生成的 .pdb 的哈希值存储在 .dll 本身中。这将是一个将 .nupkgs 和 .snupkgs 上传到 NuGet.org 的要求”。
    • *.snupkg 用于调试 nuget 包,VSTS Symbol Server 用于发布符号进行调试。一般来说,一种是用来直接调试nuget包的,一种是用来发布symbol文件的。
    【解决方案2】:

    Azure Artifacts 当前不支持.snupkgs,但它确实有一个符号服务器,如果您使用 Azure Pipelines 进行构建,您可以将其发布到该服务器。 This doc 介绍如何设置发布符号的管道。

    【讨论】:

    • 实际上,您可以将 snupkg 文件发布到 Azure Artifacts - 您只是不能将它们用于调试(在撰写本文时)
    • 我稍微更新了答案。您可以将 .snupkgs 发布到服务并且它们将被接受是正确的。但是,它们不能用于在 VS 中进行调试,并且它们还会“占用”您的 nupkg 使用的包名称/版本,因此您将无法发布它,因此无法共享您正在尝试的位分享。
    • 我们目前正在将 nupkg 和 snupkg 文件推送到 Azure DevOps,并且看不到您所在的包名称/版本上的“抢注”。不知道为什么我们的体验与您的不同!
    • @AlexMullans 默认行为是创建symbols.nupkg 文件而不是.snupkg。这会导致您看到的蹲下行为
    • 根据documentation for SourceLink,“Azure DevOps Artifacts 服务不支持符号包”。
    【解决方案3】:

    您可能只想将符号 PDB 嵌入到主 NuGet 包本身中。 IMO 这是当今最好的方法 - 它更简单,完全不需要符号服务器,并且适用于所有存储库类型,私有 VSTS/Azure DevOps 提供公共存储库。唯一的缺点是客户端必须下载稍微大一点的 NuGet 包,即使他们不使用调试信息,但这似乎微不足道。

    在 NuGet 包中添加 PDB 通常只需将其添加到项目文件中即可:

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

    请参阅 NuGet #4142Include pdb files into my nuget (nupkg) files

    【讨论】:

      【解决方案4】:

      您可以将 snupkg 文件发布到 Azure DevOps,但此时,您无法使用 VS 使用它们进行调试。这是我的做法:

      1) 设置“使用 .Net Core”任务将 .net sdk 升级到支持此功能的版本(如下)

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

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

      这会导致 snupkg 被推送到 Azure DevOps Artifacts,因此:

      【讨论】:

      • 我设法实现了这一点,但是在查看 AzureDevops Artifacts 中的工件时,似乎没有可用的符号。推送后您是否设法使用它们?
      • @JoHam 我最近没有尝试过,但是当我发布这个答案时,Azure DevOps 没有将工件存储库识别为有效的符号位置。上次我听说,这有点远。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      相关资源
      最近更新 更多