如何debugging到从TeamCity部署的nuget包?
我已经把我的团队使用的一个库放入了一个从TeamCity部署到networking文件夹的Nuget包中。 我不能debugging到这个代码,但! SymbolSource是我已经阅读的一个解决scheme,但是我更愿意find一些方法直接从Teamcity访问.pdb /源文件。 有谁知道如何做到这一点?
编辑。 当我在Nuget Pack构build步骤中选中'Include Symbols and Source'
时,除了networking文件夹中的.nupkg文件外,TeamCity还创build了一个.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>
这添加了我的库的dll,pdb和源文件在nuget包中,并没有生成一个.Symbols文件,我认为这只是符号服务器需要的。
对于更轻量级的解决scheme:
- 将pdb放在NuGet软件包旁边。
- 将源代码添加到引用包的解决scheme的debugging源文件。
这意味着您将能够遍历代码和查看exception,但是您可能必须先在磁盘上find一个文件并将其打开,然后才能设置断点。 显然你需要小心,来源是在正确的修订。
更详细的步骤1
如果你目前正在打包没有Nuspec,你需要创build一个Nuspec,然后将pdb添加到lib文件夹中的文件列表“NuGet spec”可能是一个有用的命令,用于生成NuGet中定义的初始规范文档 。 然后确保Team City Nuget Pack步骤正在引用新的nuspec。
更详细的步骤2
打开解决scheme时,右键单击解决scheme,select属性…通用属性…debugging源文件,并添加相关二进制引用的根源目录。 或者看MSDN 。 请注意,debugging时无法打开解决scheme属性。
dotPeek(免费!)的最新版本可以作为一个符号服务器,并在飞行中生成pdb文件。 这使我能够debugging通过teamcity提供的dll。
在这里下载:
http://blog.jetbrains.com/dotnet/2014/04/09/introducing-dotpeek-1-2-early-access-program/
说明如何在这里设置它。
你当然可以设置和configuration你自己的符号服务器 ,但它可能是最简单的…
- 下载并安装Inedo的ProGet
- 在目标Feed上启用符号服务
- 从TeamCity发布包到ProGet源
- 使用ProGet作为您的主要饲料来源(因为它可以聚合多个饲料,包括nuget.org)
所有这些都可以使用ProGet的免费版本来完成。
免责声明 – 我的日常工作是在Inedo
在你的.nuspec
(直接在<package>
):
<files> <file src="bin\$configuration$\$id$.pdb" target="lib\net451\" /> </files>
(将net451
更改为您正在编译的平台)
由于这个问题最初发布,Jetbrains已经写了一个完整的博客文章,如何做到这一点。 这些步骤可以概括为:
- 在代理上安装Windowsdebugging工具 。
- 安装并启用Symbol Server插件 。
- 将符号文件索引器构buildfunction添加到您的构buildconfiguration。
- 确保将PDB文件输出为制品。
- 将Visual Studioconfiguration为使用TeamCity作为源服务器。
如果您正在使用Nuget Package构build步骤,则可以选中“Include Symbols and Source”来输出包含PDB的.symbol.nupkg
。 根据符号文件索引器是否足够聪明来查看这个文件,你可能需要改变文件扩展名以使其工作。
详细信息在这里给出: https : //blog.jetbrains.com/teamcity/2015/02/setting-up-teamcity-as-symbol-and-source-server/
这是我发现的工作,但所有的步骤可能不需要…
注意 :这不允许您同时debugging,只有nuget包或安装它的解决scheme。
- 以pipe理员身份运行Visual Studio
- 打开并启动主机应用程序(您在其中安装Nuget包的那个) 而不进行debugging (Ctrl + F5)
- 在Nuget包解决scheme中,确保不会选中
Tools > Options > Debugging > General > "Require source files to exactly match the original version"
。 - 确保
"Enable just my code"
不被选中 - 在
Tools > Options > Debugging > Symbols
添加一个指向Nuget包源目录的新文件夹。 (你真的进入文件夹path,见下图) - 单击
Debug > Attach to Process...
- find
iisexpress
(可能有多个,它不会造成任何伤害)
如果你有包的源代码,那么万无一失(但可能很费力)的方法是:
- 将包的源代码添加到您的解决scheme(右键单击解决scheme – >添加现有项目)
- 浏览解决scheme中的所有项目,并删除NuGet对库的引用(即打开每个项目下的References文件夹,并删除对该包的引用)。然后,在解决scheme中添加对NuGet包项目的引用。 (即右键单击引用,添加引用,select项目并勾选项目框)
当我想要在NuGet包内debugging的方法被框架调用而不是我的代码的时候,我不得不这样做,所以我不能进入它。 (在我的情况下,该方法是一个ASP.NET DelegatingHandler)。
完成之后,您需要通过源代码pipe理撤消所有更改,以便正确引用NuGet包。
如果您的代码位于公共Git存储库中,或者至less在您的networking中无需身份validation即可访问,那么GitLink将是一个选项:
https://github.com/GitTools/GitLink
GitLink通过更改PDB指向Git服务器使符号服务器过时。 但是,正如之前所说的,这使得Git仓库成为公共的必要 – 直到现在,在访问私有仓库时没有“正确的”方式进行身份validation。