如何调试从 TeamCity 部署的我的 nuget 包?
Posted
技术标签:
【中文标题】如何调试从 TeamCity 部署的我的 nuget 包?【英文标题】:How to debug into my nuget package deployed from TeamCity? 【发布时间】:2014-03-18 10:38:06 【问题描述】:我已将我的团队使用的库放入从 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 文件。
【问题讨论】:
【参考方案1】:传统方法
-
将 pdb 与 dll 放在 NuGet 包中。
将源代码添加到引用包的解决方案的调试源文件中。
这意味着您将能够单步执行代码并查看异常,但您可能必须先在磁盘上找到一个文件并打开它,然后才能设置断点。显然,您需要注意源的版本是否正确。
关于步骤的更多细节
如果您当前在没有 Nuspec 的情况下打包,则需要创建一个 Nuspec,然后将 pdb 添加到 lib 文件夹中的文件列表“NuGet spec”可能是生成初始规范的有用命令在NuGet docs 中定义。然后确保 Team City Nuget Pack 步骤引用您的新 nuspec。
关于第 2 步的更多详细信息
打开解决方案后,右键单击解决方案,选择属性...通用属性...调试源文件,然后添加相关二进制引用的根源目录。或查看MSDN。 请注意,调试时无法打开解决方案属性。
还没有遇到断点?
尝试从工具->选项中禁用此功能:
公共或私人回购的现代方式
为确保源代码的确切版本可用,请在构建时将其嵌入。
从 Visual Studio 2017 15.5+ 开始,您可以添加 EmbedAllSources 属性:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<EmbedAllSources>true</EmbedAllSources>
公共回购的现代方式
要使您的 nuget 和库大小保持较小,您可以使用 sourcelink package。
它会生成一个 pdb,将调试器定向到来自您的 VCS 提供程序(例如 GitHub、BitBucket)的文件的正确版本。
【讨论】:
不确定这是否是一个错误,但在 VS2015 中尝试此操作的任何人单击“调试源文件”都不会显示正确的窗口,它似乎显示了配置管理器。 @Choco Smith 我有同样的问题。右键解决方案文件,Common Properties->Debug Source Files 显示 VS 2015 中的 Configuration Manager 窗口。你知道 VS2015 中如何显示 Debug Source Files 窗口吗? 在 VS2015 中对我来说一直很好用。我今天在 VS Enterprise 2015 版本 14.0.24720.00 上使用了它。如果它不只是一个流氓扩展弄乱了您的菜单,也许会造成 Microsoft Connect 问题? connect.microsoft.com/VisualStudio/MSNetNative【参考方案2】:最新版本的 dotPeek(免费!)可以充当符号服务器并即时生成 pdb 文件。这使我能够调试通过 teamcity 提供的 dll。
在这里下载:
http://blog.jetbrains.com/dotnet/2014/04/09/introducing-dotpeek-1-2-early-access-program/
有关如何在此处进行设置的说明。
https://web.archive.org/web/20160220163146/http://confluence.jetbrains.com/display/NETCOM/dotPeek+Symbol+Server+and+PDB+Generation
【讨论】:
我希望我能再次投票给你。我今年早些时候来到这里并忘记了这一点,现在我需要做同样的事情。中提琴..你的答案很震撼! 您使用了存档链接。很棒的答案。【参考方案3】:你当然可以set-up & configure your own symbol server,但这可能是最简单的...
-
下载并安装 Inedo 的ProGet
在目标 Feed 上启用符号服务
将包从 TeamCity 发布到 ProGet 源
使用 ProGet 作为您的主要提要来源(因为它可以聚合多个提要,包括 nuget.org)
所有这些都可以通过 ProGet 的免费版来完成。
免责声明 -- 我的日常工作是Inedo
【讨论】:
如果我已经有了 .Symbol.nupkg 文件,为什么还需要一个“符号服务器”? Visual Studio 不能直接读取这个文件吗? @anthonybell 哦,绝对不是! “.symbol.nupkg”文件只不过是一个 zip 文件。 Visual Studio 需要首先找到一个远程 .pdb 文件(通过程序集散列),然后该文件将指向散列的源文件 url。像 ProGet 这样的符号服务器将重新索引 pdb 文件并基于它提供文件。见inedo.com/support/kb/1036/using-progets-symbol-server @anthonybell 根据MS documenation 这应该是可能的,但到目前为止 VS 无法从网络共享或本地文件夹加载符号包。 我不得不修改我的提要的“符号服务器”设置并禁用设置“从从该提要下载的包中去除符号文件”。但是卸载然后重新安装包仍然没有在包中包含 *.pdb 文件。 重启 ProGet 也无济于事,但我运行的是旧版本的 Visual Studio (2012) 和 ProGet (3.8.6)。【参考方案4】:在你的.nuspec
(直接在<package>
下):
<files>
<file src="bin\$configuration$\$id$.pdb" target="lib\net451\" />
</files>
(将 net451
更改为您正在编译的平台)
【讨论】:
【参考方案5】:如果你有包的源代码,那么万无一失(但可能很费力)的方法是:
-
将包的源代码添加到您的解决方案中(右键单击解决方案 -> 添加现有项目)
浏览解决方案中的所有项目并删除对库的 NuGet 引用(即打开每个项目下的 References 文件夹并删除对包的引用。)然后,在您的文件中添加对 NuGet 包项目的引用解决方案。 (即右键单击引用,添加引用,选择项目并勾选项目的框)
当我想在 NuGet 包中调试的方法被框架而不是我的代码调用时,我不得不这样做,因此我无法进入它。 (在我的例子中,该方法是一个 ASP.NET DelegatingHandler)。
完成后,您需要通过源代码管理撤消所有更改,以便正确引用 NuGet 包。
【讨论】:
以上关于符号服务器的选项更好。这种方法每次都容易出错且耗时。设置符号服务器是一次性设置 谢谢。尽管我被否决的答案很费力,但我支持它,因为它允许我在没有源服务器的情况下调试我的代码和 NuGet 包 我不希望团队中的任何人这样做,因为它容易出错且耗时。否决投票,因为我认为这不是处理它的正确方法。我敢肯定,如果有足够多的人同意你的观点,认为这是一种明智的做法,那么他们会投票赞成,我会得到彻底的纠正。 如果你有源代码,你也可以这样做:在使用nuget包的项目的项目属性中,将私有nuget包源代码的bin\debug文件夹添加到参考路径。 (见mariuszrokita.com/…) 赞成,因为它不需要购买/安装一些随机产品或服务器,或更改 nuspec,您可能并不总是希望快速查看某些内容。只需正确使用源代码管理即可撤消您的更改。git co .
。完成【参考方案6】:
我找到了一个超级简单的方法来做到这一点,我在这里写过博客:
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 或源服务器。这大大加快了我的开发周期。
【讨论】:
这只适用于新的项目文件格式/ProjectReferences 您的示例位置是 Windows 上的默认全局包位置 (%userprofile%\.nuget\packages)。从那里到 NuGet 3.3+ 中的 dll 的路径是 packagename\version\lib\。那是你复制的地方吗?你是手动复制还是使用nuget add? @jla 是的,你应该看到现有的 dll,要么复制它,要么我重命名原始的,以防你想恢复它。【参考方案7】:自从这个问题最初发布以来,Jetbrains 已经写了一篇完整的博客文章来介绍如何完成这个问题。步骤可以概括为:
在代理上安装Debugging Tools for Windows。 安装并启用Symbol Server plugin。 将符号文件索引器构建功能添加到您的构建配置中。 确保 PDB 文件作为人工制品输出。 将 Visual Studio 配置为使用 TeamCity 作为源服务器。如果您使用 Nuget 包构建步骤,您可以选中“包含符号和源代码”以输出包含 PDB 的 .symbol.nupkg
。根据符号文件索引器是否足够智能以查看此文件,您可能需要更改文件扩展名才能正常工作。
此处提供了完整的详细信息: https://blog.jetbrains.com/teamcity/2015/02/setting-up-teamcity-as-symbol-and-source-server/
【讨论】:
【参考方案8】:这是我发现的工作,但可能不需要所有步骤......
注意:这不允许你同时调试,只能调试 nuget 包或安装它的解决方案。
-
以管理员身份运行 Visual Studio
打开并启动宿主应用程序(您安装 Nuget 包的那个)无需调试 (Ctrl + F5)
在 Nuget 包解决方案中,确保
Tools > Options > Debugging > General > "Require source files to exactly match the original version"
被未选中。
确保"Enable just my code"
被未选中
在Tools > Options > Debugging > Symbols
中添加一个新文件夹,指向Nuget 包的源目录。 (您按字面意思输入文件夹路径,见下图)
点击Debug > Attach to Process...
找到iisexpress
(可能有多个,对所有都没有害处)
【讨论】:
@CristianE。 nuget 包可以是类库。上面的说明正是为此。它仍然需要在您安装 nuget 包的主机应用程序(如网站或控制台应用程序)中执行。【参考方案9】:如果您的代码位于公共 Git 存储库中,或者至少在您的网络中,无需身份验证即可访问,那么 GitLink 将是一个选项:
https://github.com/GitTools/GitLink
GitLink 通过将 PDB 更改为指向 Git 服务器来淘汰符号服务器。但是,如前所述,这使得 Git 存储库必须是公开的——直到现在,在访问私有存储库时还没有“正确”的方式来进行身份验证。
【讨论】:
【参考方案10】:Microsoft 现已在 https://github.com/dotnet/sourcelink/ 集成了 SourceLink NuGet 包,如果 NuGet 包的发布者设置了源代码,则可以在调试时按需下载源代码。
【讨论】:
以上是关于如何调试从 TeamCity 部署的我的 nuget 包?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TeamCity 在 Azure Service Fabric 中自动部署 Docker 容器?
如何使用 TeamCity 部署到环境,然后针对该环境运行测试?