如何调试在 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 > debug > 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=>Properties=>Debug Source Files
添加文件夹的路径。
那么当你在 VS 中调试 ProjectD
时,调试器可以进入源代码,因为现在 VS 调试器知道在哪里可以找到源文件。
另外:
如果您可以确认源文件的版本与打包的程序集和 pdb 的版本相匹配,您可以随意取消警告 (The source file is different
),方法是转到 debug=>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管道为解决方案中的每个项目单独发布工件?
如何在 Maven GitLab CI/CD 管道中将 JaCoCo 报告 HTML 转换为 PDF
如何在 Linux 终端中使用 MCR(Matlab 编译器运行时)运行 Matlab 文件?