我有一个构建服务器,用于构建内部Nuget软件包。当我使用该程序包并尝试进入一种方法时,它不起作用。
所有符号都发布到我的符号服务器上,并且我已在VS设置中启用了此符号。
如果检查“模块”窗口,则会看到Nuget DLL在那里,并且已从符号服务器为其加载了正确的符号。
但是,当我尝试进入代码时,它会跳过该方法。如果我使用调用堆栈专门查看该行代码,则显示“找不到ClientBase.cs”。如果展开“源搜索信息”,则会看到以下内容:
找到'C:\ Build的源 Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs”。 (没有校验和。)
文件'C:\ Build Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs' 不存在。
在脚本文档中查找'C:\ Build Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs'...
在项目中查找'C:\ Build Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs”。
在项目中找不到文件。
使用来源查找来源 服务器...
活动解决方案的调试源文件设置 指示调试器将不要求用户查找文件: C:\ Build Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs。
调试器无法找到源文件'C:\ Build Agent \ vsts-agent-win7-x64-2.117.1_work \ 1 \ s \ ClientsShared \ Class \ ClientBase.cs'。
为什么要在Build Agent上寻找源代码?不应将其存储在Symbol Server的PDB中吗?
答案 0 :(得分:3)
可能发生的是您添加到NuGet软件包中的PDB文件不是索引文件。这是MSBuild构建的原始文件。
您在使用TeamCity吗?您只有一个构建配置吗?如果是这样,那么肯定是这种情况。
TeamCity会将所有作为工件创建的PDB文件编入索引(假设您已安装plugin)。这有个要点:为PDB编制索引意味着修改您的PDB。修改后的PDB将在构建工件中找到。由于在构建过程中没有必要提供经过修改的(索引的)PDB,因此您必须将其分为两种配置。
创建一个名为Build的构建配置,然后编辑配置设置。查看常规设置。 Artifact Paths列出了将从构建中输出的文件。
此文本框列出了一系列规则:将符合 this 模式的文件复制到 that 路径中的工件。您想要添加规则以使用正确的相对结构将dll,pdb,sln,csproj,nuspec和packages.config文件复制到工件。您应该以如下形式结束:
MyProject.sln
MyProject/bin/Release/MyProject.pdb => MyProject/bin/Release
MyProject/bin/Release/MyProject.dll => MyProject/bin/Release
MyProject/MyProject.csproj => MyProject
MyProject/MyProject.nuspec => MyProject
MyProject/packages.config => MyProject
运行此构建,并验证您是否获得了预期的工件。检查构建日志,并确保它包括步骤“索引符号源”和“发布符号源”。然后,单击成功构建的“工件”选项卡,应列出这六个文件并采用正确的目录结构。
由于TeamCity在对PDB进行索引时会对其进行修改,因此无法在Build配置中生成NuGet软件包。您需要第二个配置。我们将其称为“ NuGet”。
创建一个名为NuGet的新构建配置,然后编辑配置设置。查看依赖关系,并添加一个新的工件依赖关系。这应该取决于Build配置并从上一次成功的构建中获取构件。引入我们从Build配置输出的所有文件:
**/*
创建一个名为“ NuGet Install”的构建步骤。这应该是还原所有依赖项的“ NuGet安装”步骤。输入您的* .sln文件的名称。
创建第二个构建步骤,称为“ NuGet Pack”。这应该是一个“ NuGet Pack”步骤。规范文件实际上是您的csproj,而不是您的nuspec!只需提供完整路径,例如MyProject / MyProject.csproj。将输出目录设置为“ Packages”,然后选中“发布创建的软件包以构建工件”。
要完成图片,您需要确保* .nuspec文件包含PDB文件。您可以通过将DLL和PDB列为* .nuspec中的文件来完成此操作。在下面添加一个部分(不在其内部)并列出这两个文件。它应该看起来像这样:
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>$author$</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<copyright>Copyright 2018</copyright>
</metadata>
<files>
<file src="bin\Release\MyProject.dll" target="lib\net461" />
<file src="bin\Release\MyProject.pdb" target="lib\net461" />
</files>
</package>