如何调试在 CI/CD 管道中编译和打包的 Release NuGet 包?

Posted

技术标签:

【中文标题】如何调试在 CI/CD 管道中编译和打包的 Release NuGet 包?【英文标题】:How do I debug a Release NuGet package compiled and packed in a CI/CD pipeline? 【发布时间】:2019-11-26 11:46:01 【问题描述】:

以下类库项目(.NET Framework 4.6.2发布模式)已发布到私有 NuGet Feed:

项目 A(包含 ProjectA.dll、ProjectA.pdb) 项目 B(包含 ProjectB.dll、ProjectB.pdb) 项目 C(包含 ProjectC.dll、ProjectC.pdb)

上面的 NuGet 包被添加到单个控制台应用程序project D 中,该应用程序被编译并成功执行。但是,当尝试从项目 D 以调试模式单步执行代码时,会打开一个窗口,尝试在其编译位置找到文件 ProjectAClass1.cs。

在网上搜索了这么多,我通过更新nuspec文件将源类文件添加到包中,现在nuget包结构如下:src包含所有类。这就是 nuspec 现在的样子:

  <files>
    <file src="ProjectA.dll" target="lib\net462" />
    <file src="ProjectA.pdb" target="lib\net462" />
    <file src="**\*.cs" target="src" />
  </files>

尝试在 Visual Studio 中调试时 - 发生了同样的事情:它试图找到 ProjectAClass1.cs,所以我提供了位置:D:\ProjectD\packages\ProjectA\1.0.1\src\ProjectAClass1.cs,这次我能够成功调试。

但是如果我更新nuget包的版本,可能会再次提示类的位置。

我目前使用 SVN、TeamCity 进行构建/发布、Visual Studio 2017.9 进行调试、私有 nuget 提要。我不能使用符号服务器,因为该组织由于安全问题而犹豫不决,我目前只看到sourcelink supports git。

这是调试的正确方法吗?或者是否有任何其他选项可用于调试以发布模式发布的类库项目?或者有什么方法可以将所有类嵌入到 DLL 中,以便它自动找到类并调试它们?

【问题讨论】:

嗨朋友,这个问题有什么更新吗?我的回答可以帮助解决吗?如果问题仍然存在并阻止您,请随时告诉我 :) 嗨@LanceLi-MSFT - 在与我的前辈讨论后,我们现在正在使用评论中指定的方法,即当我们发布一个nuget时,我们还会在其中包含* .cs文件,而调试我们将源码指向安装在解决方案路径下的nuget包文件夹。每次 nuget 更新后,我们手动更新解决方案属性中的路径 > 调试 > 添加调试源文件 很高兴知道它会有所帮助,如果我稍后将评论添加到我的答案中,您介意接受它作为答案吗:) after every nuget update we manually update the path in the solution properties &gt; debug &gt; add debug source file 。也许您可以在创建 nuget 包时尝试添加 install.ps1 或 package_ID.targets 文件。然后 install.ps1 或目标文件将在您卸载+安装或更新软件包时执行。 (可以在powershell脚本或msbuild xx.targets中编写逻辑将源文件复制到特定路径,然后只需要添加一次调试源文件的路径) 【参考方案1】:

这是调试的正确方法吗?或者有没有其他选择 可用于调试发布于 发布模式?或者有没有办法将所有类嵌入到 DLL,以便它自动找到类并调试它们?

我建议你可以试试这个方法:

1.在本地创建一个文件夹,存放ProjectA、ProjectB、ProjectC的所有源文件(确保源文件的版本与构建nuget包的版本一致)

2.在projectD存在的解决方案中,right-click Solution=&gt;Properties=&gt;Debug Source Files添加文件夹的路径。

那么当你在 VS 中调试 ProjectD 时,调试器可以进入源代码,因为现在 VS 调试器知道在哪里可以找到源文件。

另外:

如果您可以确认源文件的版本与打包的程序集和 pdb 的版本相匹配,您可以随意取消警告 (The source file is different),方法是转到 debug=&gt;Options 取消选中 require source files to exactly match original version 选项。

【讨论】:

是的,我们现在正在这样做,但是很难管理课程的版本。大多数情况下,我们会收到类似“源文件与构建模块时不同。你还是想让调试器使用它吗?” Go debug=>取消选中require source files to exactly match original version的选项可以使警告消失。但这不是一个好主意...我们应该小心确保 xx.cs 文件与输出 xx.dll 和 xx.pdb 的版本相同...

以上是关于如何调试在 CI/CD 管道中编译和打包的 Release NuGet 包?的主要内容,如果未能解决你的问题,请参考以下文章

如何从VSTS CI管道为解决方案中的每个项目单独发布工件?

Gitlab CI/CD 如何在管道中捕获 curl 响应

如何在 Maven GitLab CI/CD 管道中将 JaCoCo 报告 HTML 转换为 PDF

如何在 Linux 终端中使用 MCR(Matlab 编译器运行时)运行 Matlab 文件?

AWS Lambda - 在 CI/CD 管道中版本控制和提升 lambda 的最佳实践是啥

剪切新版本时如何触发 GitLab CI/CD 管道?