如何调试从TeamCity部署的nuget包?

时间:2014-02-18 15:10:56

标签: c# deployment teamcity nuget symbol-server

我已将我的团队使用的库放入从TeamCity部署到网络文件夹的nuget包中。我虽然无法调试这段代码! SymbolSource是我读过的一个解决方案,但我更愿意找到一些方法直接从Teamcity访问.pdb /源文件。有谁知道如何做到这一点?

编辑。当我在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文件,我认为只有符号服务器才需要。

10 个答案:

答案 0 :(得分:68)

可靠的轻量级解决方案

  1. 将pdb与dll一起放在NuGet包中。
  2. 将源代码添加到引用该程序包的解决方案的调试源文件中。
  3. 这意味着您将能够单步执行代码并查看异常,但您可能必须在磁盘上找到一个文件并在设置断点之前将其打开。显然,您需要注意源是正确的修订版。

    有关第1步的更多详情

    如果你目前正在打包没有Nuspec,你需要创建一个Nuspec,然后将pdb添加到lib文件夹中的文件列表“NuGet spec”可能是一个有用的命令,用于生成初始规范在NuGet docs中定义。然后确保Team City Nuget Pack步骤引用您的新nuspec。

    有关第2步的详细信息

    打开解决方案后,右键单击Solution,选择Properties ... Common Properties ... Debug Source Files,然后添加相关二进制引用的根源目录。或者查看MSDN。 注意,调试时无法打开解决方案属性。

    将来 - 源嵌入

    从Visual Studio 2017 15.5 preview2中,您可以将以下内容添加到项目文件中:

    <PropertyGroup>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
        <IncludeSymbolsInPackage>true</IncludeSymbolsInPackage>
        <DebugSymbols>true</DebugSymbols>
        <DebugType>portable</DebugType> <!-- Required for EmbedSources -->
        <EmbedSources>true</EmbedSources>
    </PropertyGroup>
    <ItemGroup>
        <!-- Does the equivalent of EmbedSources in MSBuild (hopefully won't be needed long term) -->
        <Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
    </ItemGroup>
    

    这种方法还处于早期阶段,可能会有一些注意事项,请参阅this comment的底部和相关讨论以了解更多信息。

答案 1 :(得分:29)

最新版本的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

答案 2 :(得分:8)

你当然可以set-up & configure your own symbol server,但它可能最容易......

  1. 下载并安装Inedo的ProGet
  2. 启用目标Feed上的符号服务
  3. 将包从TeamCity发布到ProGet供稿
  4. 使用ProGet作为主要供稿源(因为它可以汇总多个供稿,包括nuget.org)
  5. 所有这一切都可以通过免费版的ProGet来完成。


    免责声明 - 我的日常工作是Inedo

答案 3 :(得分:6)

.nuspec(直接在<package>下):

<files>
  <file src="bin\$configuration$\$id$.pdb" target="lib\net451\" />
</files>

(将net451更改为您正在编译的平台

答案 4 :(得分:3)

我找到了一种超级简单的方法,我在这里写了博客:

https://mattfrear.com/2017/11/29/speed-up-development-in-a-nuget-package-centric-solution/

这仅适用于您使用新的.NET Core样式.csproj和<PackageReference>(在.NET Core或.NET Framework上)。

这再次假设您可以访问NuGet包的源代码。

  1. 在本地计算机上构建和编译NuGet包
  2. 将您刚刚编译的.dll复制到本地NuGet包源文件夹(在我的机器上,这是C:\Users\matt\.nuget\packages\),覆盖现有的NuGet包.dll。
  3. 就是这样!您应该能够在调试时进入包中。不要乱用.pdbs或源服务器。这大大加快了我的开发周期。

答案 5 :(得分:2)

由于这个问题最初发布,Jetbrains写了一篇关于如何实现这一目标的完整博客文章。这些步骤可以概括为:

  • 在代理商上安装Debugging Tools for Windows
  • 安装&amp;启用Symbol Server plugin
  • 将符号文件索引器构建功能添加到构建配置中。
  • 确保PDB文件作为人工制品输出。
  • 配置Visual Studio以将TeamCity用作源服务器。

如果您正在使用Nuget Package构建步骤,则可以选中“包含符号和来源”#39;输出包含PDB的.symbol.nupkg。根据符号文件索引器是否足够智能以查看此文件,您可能需要更改文件扩展名才能使用。

详情如下: https://blog.jetbrains.com/teamcity/2015/02/setting-up-teamcity-as-symbol-and-source-server/

答案 6 :(得分:2)

如果你有包的源代码,那么万无一失(但可能很费力)的方法是:

  1. 将软件包的源代码添加到您的解决方案中(右键单击解决方案 - &gt;添加现有项目)
  2. 浏览解决方案中的所有项目并删除对库的NuGet引用(即打开每个项目下的References文件夹并删除对该包的引用。)然后,在您的库中添加对NuGet包项目的引用解。 (即右键单击引用,添加引用,选择项目并勾选项目框)
  3. 当我想在NuGet包中调试的方法被框架而不是我的代码调用时,我必须这样做,因此我无法进入它。 (在我的例子中,该方法是一个ASP.NET DelegatingHandler)。

    完成后,您将希望通过源代码管理撤消所有更改,以便正确引用NuGet包。

答案 7 :(得分:2)

这是我发现的工作,但可能不需要所有步骤......

  

注意:这不允许你调试两者,只有nuget   包或安装它的解决方案。

  1. 以管理员身份运行Visual Studio
  2. 打开并启动主机应用程序(安装Nuget软件包的应用程序)无需调试(Ctrl + F5)
  3. 在Nuget包解决方案中,确保Tools > Options > Debugging > General > "Require source files to exactly match the original version" 已选中。
  4. 确保"Enable just my code" 已选中
  5. Tools > Options > Debugging > Symbols中添加一个指向Nuget包源目录的新文件夹。 (您确实输入了文件夹路径,请参见下图)
  6. 点击Debug > Attach to Process...
  7. 查找iisexpress(可能有多个,不会对所有人造成任何伤害)
  8. Screenshot of Symbol Source Locations

答案 8 :(得分:0)

如果您的代码位于公共Git存储库中,或者至少在您的网络中,无需身份验证即可访问,那么GitLink将是一个选项:

https://github.com/GitTools/GitLink

GitLink通过将PDB更改为指向Git服务器来使符号服务器过时。但是,如前所述,这使得Git存储库必须公开 - 直到现在还没有&#34;正确的&#34;访问私有存储库时进行身份验证的方法。

答案 9 :(得分:0)

Microsoft现在在https://github.com/dotnet/sourcelink/处集成了SourceLink NuGet软件包,如果NuGet软件包的发布者对其进行了设置,则可以在调试时按需下载源代码。