我已将我的团队使用的库放入从 TeamCity 部署到网络文件夹的 nuget 包中。我无法调试到这段代码! SymbolSource 是我读过的一种解决方案,但我更愿意找到某种方法来直接从 TeamCity 访问 .pdb/source 文件。有谁知道如何做到这一点?
编辑。当我在 Nuget Pack 构建步骤中选中 'Include Symbols and Source'
时,除了网络文件夹中的 .nupkg 文件之外,TeamCity 还会创建一个 .Symbol.nupkg。 .Symbol.nupkg 包含 src 和 .pdb 文件。
编辑。我取消选中 TeamCity 上的 'Include Symbols and Source'
并将以下内容添加到我的 nuspec 文件中:
<files>
<file src="..\MyLibrary\bin\release\MyLibrary.dll" target="lib\net40" />
<file src="..\MyLibrary\bin\release\MyLibrary.pdb" target="lib\net40" />
<file src="..\MyLibrary\*.cs" target="src" />
<file src="..\MyLibrary\**\*.cs" target="src" />
</files>
这在 nuget 包中添加了我的库的 dll、pdb 和源文件,并且没有生成我认为只有符号服务器才需要的 .Symbols 文件。
传统方法
将 pdb 放在 dll 旁边的 NuGet 包中。将源代码添加到引用包的解决方案的调试源文件中。
这意味着您将能够单步执行代码并查看异常,但您可能必须在磁盘上找到一个文件并打开它,然后才能设置断点。显然,您需要注意源的版本是否正确。
步骤的更多细节
如果您当前在没有 Nuspec 的情况下打包,则需要创建一个 Nuspec,然后将 pdb 添加到 lib 文件夹中的文件列表中“NuGet spec”可能是用于生成初始规范的有用命令,如 { 1}。然后确保 Team City Nuget Pack 步骤引用了您的新 nuspec。
有关步骤 2 的更多详细信息
打开解决方案后,右键单击解决方案,选择属性...通用属性...调试源文件,然后添加相关二进制引用的根源目录。或参见MSDN。请注意,调试时无法打开解决方案属性。
还没有达到断点?
https://i.stack.imgur.com/1vEia.png
公共或私人回购的现代方式
为确保源代码的确切版本可用,请在构建时将其嵌入。
从 Visual Studio 2017 15.5+ 开始,您可以添加 EmbedAllSources 属性:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<EmbedAllSources>true</EmbedAllSources>
公共回购的现代方式
要使您的 nuget 和库大小保持较小,您可以使用 sourcelink package。
它会生成一个 pdb,将调试器定向到来自您的 VCS 提供程序(例如 GitHub、BitBucket)的文件的正确版本。
最新版本的 dotPeek(免费!)可以充当符号服务器并即时生成 pdb 文件。这使我能够调试通过 teamcity 提供的 dll。
在这里下载:
http://blog.jetbrains.com/dotnet/2014/04/09/introducing-dotpeek-1-2-early-access-program/
有关如何在此处进行设置的说明。
您当然可以set-up & configure your own symbol server,但这可能是最简单的...
下载并安装 Inedo 的 ProGet 启用符号服务于目标提要发布包从 TeamCity 到 ProGet 提要使用 ProGet 作为您的主要提要源(因为它可以聚合多个提要,包括 nuget.org)
所有这些都可以通过 ProGet 的免费版来完成。
免责声明 -- 我的日常工作是在 Inedo
在您的 .nuspec
中(直接在 <package>
下):
<files>
<file src="bin\$configuration$\$id$.pdb" target="lib\net451\" />
</files>
(将 net451
更改为您正在编译的平台)
如果您有软件包的源代码,那么万无一失(但可能很费力)的方法是:
将包的源代码添加到您的解决方案中(右键单击解决方案 -> 添加现有项目)浏览解决方案中的所有项目并删除对库的 NuGet 引用(即打开每个项目下的 References 文件夹并删除引用到包。)然后,在您的解决方案中添加对 NuGet 包项目的引用。 (即右键单击引用,添加引用,选择项目并勾选项目框)
当我想在 NuGet 包中调试的方法被框架而不是我的代码调用时,我不得不这样做,因此我无法进入它。 (在我的例子中,该方法是一个 ASP.NET DelegatingHandler)。
完成后,您需要通过源代码管理撤消所有更改,以便正确引用 NuGet 包。
git co .
。完毕
我找到了一种超级简单的方法来做到这一点,我在这里写过博客:
https://mattfrear.com/2017/11/29/speed-up-development-in-a-nuget-package-centric-solution/
这仅在您使用带有 <PackageReference>
的新 .NET Core 样式 .csproj(在 .NET Core 或 .NET Framework 上)时才有效。
这再次假设您可以访问 NuGet 包的源代码。
在本地机器上构建和编译 NuGet 包 将刚刚编译的 .dll 复制到本地 NuGet 包源文件夹(在我的机器上,这是 C:\Users\matt\.nuget\packages\),覆盖现有NuGet 包 .dll。
而已!您应该能够在调试时单步执行该包。不要乱用 .pdbs 或源服务器。这大大加快了我的开发周期。
由于最初发布了这个问题,Jetbrains 已经写了一篇关于如何完成这个问题的完整博客文章。步骤可以概括为:
在代理上安装适用于 Windows 的调试工具。
安装并启用 Symbol Server 插件。
将符号文件索引器构建功能添加到您的构建配置中。
确保 PDB 文件作为人工制品输出。
将 Visual Studio 配置为使用 TeamCity 作为源服务器。
如果您使用 Nuget 包构建步骤,您可以选中“包含符号和源”以输出包含 PDB 的 .symbol.nupkg
。根据符号文件索引器是否足够智能以查看此文件,您可能需要更改文件扩展名才能正常工作。
此处提供了完整的详细信息:https://blog.jetbrains.com/teamcity/2015/02/setting-up-teamcity-as-symbol-and-source-server/
这是我发现的工作,但可能不需要所有步骤......
注意:这不允许您同时调试 nuget 包或安装它的解决方案。
以管理员身份运行 Visual Studio 打开并启动宿主应用程序(安装 Nuget 包的那个)而不进行调试 (Ctrl + F5) 在 Nuget 包解决方案中,确保工具 > 选项 > 调试 > 常规 > “需要源文件完全匹配原始版本”未选中。确保未选中“仅启用我的代码”在“工具”>“选项”>“调试”>“符号”中添加一个新文件夹,指向 Nuget 包的源目录。 (您从字面上输入文件夹路径,见下图)单击 Debug > Attach to Process... 查找 iisexpress (可能有多个,附加到所有都不会造成任何伤害)
https://i.stack.imgur.com/ivCF3.png
如果您的代码位于公共 Git 存储库中,或者至少在您的网络中,无需身份验证即可访问,那么 GitLink 将是一个选项:
https://github.com/GitTools/GitLink
GitLink 通过将 PDB 更改为指向 Git 服务器来淘汰符号服务器。但是,如前所述,这使得 Git 存储库必须是公共的——直到现在,在访问私有存储库时还没有“正确”的方式来进行身份验证。
Microsoft 现在已在 https://github.com/dotnet/sourcelink/ 中集成了 SourceLink NuGet 包,如果 NuGet 包的发布者设置了源代码,则可以在调试时按需下载源代码。