是否可以在网络共享的 NuGet 本地源中同时托管常规包和符号包?

Posted

技术标签:

【中文标题】是否可以在网络共享的 NuGet 本地源中同时托管常规包和符号包?【英文标题】:Is it possible to host both regular and symbols packages in a NuGet local feed on a network share? 【发布时间】:2017-08-10 18:11:29 【问题描述】:

首先,我对 NuGet 还是很陌生。我在工作中开发了许多内部 C# 桌面应用程序,它们之间共享一些通用代码。我一直在从使用项目引用切换到创建私有 NuGet 包并将它们托管在位于共享网络文件夹中的本地源中。我现在才用了几天,但我已经成功地将我的一些库项目变成了包,并在迄今为止的其他项目中使用它们。

问题在于,虽然我可以在依赖它们的其他解决方案中使用这些包提供的代码,但我没有获得 IntelliSense 支持或在包本身内进行调试的能力。结果发现只有组装好的DLL分布在普通包中,根据我从网上搜索的信息,我还需要创建符号包,其中包含IntelliSense和调试所需的文件。

当使用网络共享文件夹作为本地提要时,我该如何做到这一点 - 同时使用常规包和符号包?许多在线答案建议使用单独的符号服务器。但是,我无法将此代码公开发布到 symbolsource.org,并且我目前无法从我的雇主那里获得一台服务器来托管一个服务器(这消除了 NuGet.Server、ProGet 等解决方案)。我正在寻找的东西是否可能?

我已经看过关于创建symbol packages 和local feeds 的官方文档,以及这个related question。但这些都没有我正在寻找的信息。

编辑:我确实获得了对我的包代码的 IntelliSense 支持,方法是记住在构建时打开 XML 文档生成,使用来自 this question 的信息。不过,仍然不确定调试支持。

【问题讨论】:

【参考方案1】:

当仅使用网络共享文件夹作为本地提要时,我如何才能做到这一点 - 同时使用常规包和符号包?

恐怕答案是否定的。当我在网络共享上的 NuGet 本地源中同时托管常规包和符号包时,然后将该包安装到我的测试项目中,进行调试,Visual Studio 无法加载 .pdb 文件。因为 .pdb 文件包装在符号包中,所以 Visual Studio 无法直接访问它。所以建议是“使用单独的符号服务器。”。

由于您无法将此代码公开发布到 symbolsource.org 并且目前无法从您的雇主那里获得一台服务器来托管服务器,因此我想在这里为您提供一个轻量级解决方案

    Put the pdb and source code file in the NuGet package alongside the dll。 将源代码添加到引用包的解决方案的调试源文件中。

这意味着您将能够单步执行代码并查看异常,但您可能必须先在磁盘上找到一个文件并打开它,然后才能设置断点。显然,您需要注意源的版本是否正确。

第 1 步的详细信息:

如果您当前打包时没有 Nuspec,则需要创建 Nuspec,然后将 pdb 添加到 lib 文件夹中的文件列表和 src 文件夹中的源文件。 “NuGet 规范”可能是用于生成NuGet docs 中定义的初始规范的有用命令。下面是我的 .nuspec 文件,你可以查看:

<?xml version="1.0"?>
  <package >
    <metadata>
     <id>MyTestPackage</id>
     <version>1.0.3</version>
     <authors>Admin</authors>
     <owners>Admin</owners>
     <requireLicenseAcceptance>false</requireLicenseAcceptance>
     <description>Package description</description>
     <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
     <copyright>Copyright 2017</copyright>
     <tags>Tag1 Tag2</tags>
   </metadata>

   <files>
     <file src="bin\Debug\MyTestPackage.dll" target="lib\Net46" />
     <file src="bin\Debug\MyTestPackage.pdb" target="lib\Net46" />
     <file src="Class1.cs" target="src" />
   </files>
</package>

关于第 2 步的更多详细信息:

打开解决方案后,右键单击解决方案,选择属性...通用属性...调试源文件,然后添加相关二进制引用的根源目录。 p>

或查看MSDN。请注意,调试时无法打开解决方案属性。

使用 .nuspec 中的此设置,您只需在网络共享上的 NuGet 本地源中设置此常规包。安装这个包,然后就可以在包内调试了。

此外,SymbolSource 现在发布了一个名为SymbolSource Server Basic 的社区版。

【讨论】:

我担心是这种情况...感谢您确认。我看到实际上有一个open issue for NuGet on GitHub to improve symbols handling, perhaps with portable PDBs,所以希望这样的东西最终能够进入并消除使用服务器调试私有包的要求。

以上是关于是否可以在网络共享的 NuGet 本地源中同时托管常规包和符号包?的主要内容,如果未能解决你的问题,请参考以下文章

NuGet包尝试在所有已配置的NuGet源中检索

vs未能解析此远程名称: 'api.nuget.org'

错误NU1101:无法找到软件包”。源中不存在具有此ID的软件包:Microsoft Visual Studio脱机软件包,nuget.org

NHibernate 和共享网络托管

nuget错误:无法解析所选源的路径

Windows网络共享上的svn存储库