首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从DocFx包中检索NuGet元数据

从DocFx包中检索NuGet元数据
EN

Stack Overflow用户
提问于 2022-01-06 04:33:26
回答 1查看 237关注 0票数 -3

我有一个包含多个存储库的产品,每个存储库都是作为NuGet包分发的。我想为DocFx建立一个单独的存储库,它从NuGet包生成文档。这样,它可以将多个{存储库、项目、包}的文档合并到一个位置,同时允许独立于包发布周期更新概念文档。

TL;DR: I能够让DocFx基于NuGet包中的程序集正确地生成参考文档,但它不包含任何documentation (即从///元数据)。我该怎么解决这个问题?详情如下。

源包配置

为了实现这一点,我首先确保源项目的csproj文件配置为生成XML文档,作为构建输出的一部分:

代码语言:javascript
复制
<Project>
  <PropertyGroup>
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
  </PropertyGroup>  
</Project>

因此,nupkg文件正确地包含XML文档,例如:

代码语言:javascript
复制
/lib/net6.0/{AssemblyName}.xml

然后,当使用这些包时,例如Visual就会获取这些文档。

DocFx配置

然后我通过metadata配置文件为这些程序集添加了docfx.json

代码语言:javascript
复制
{
  "metadata": [
    {
      "src": [
        {
          "files": "bin/Release/net6.0/{AssemblyName}.dll"
        }
      ],
      "dest": "api/{AssemblyName}"
    }
  ]
  …
}

在此基础上,DocFx正确地标识名称空间、类型和成员,并为每个名称生成参考文档。到现在为止还好!

问题

问题是DocFx不包含这些程序集的任何XML (///)信息,尽管包中包含了它们。我该如何减轻这种情况呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-06 04:33:26

如果在metadata配置中指定程序集,DocFx将在同一个目录(来源)中查找documentation。但是,问题在于,当您包含NuGet引用时,项目的bin文件夹中没有包含XML,即使它包含在NuGet包中。因此,虽然DocFx能够识别结构,但它无法识别文档。

TL;DR:为了解决这个问题,您可以配置msbuild将XML复制到bin文件夹,确保DocFx能够访问它(示例)。详情如下。

背景

默认情况下,当引用NuGet包时,包将被下载、解压缩并缓存在以下位置:

代码语言:javascript
复制
%UserProfile%\.nuget\packages\{Package}\{Version}\

注意:这显然是一个Windows目录;位置将因操作系统而异。

这将包括例如,

代码语言:javascript
复制
\lib\net6.0\{AssemblyName}.dll
\lib\net6.0\{AssemblyName}.xml

构建.NET项目时,{AssemblyName}.dll将复制到项目的bin目录,而不是{AssemblyName}.xml。由于您已经指示DocFx查看您的项目的bin文件夹,因此它无法收集文档。

天真的解决办法

显而易见的解决办法是直接从NuGet缓存中获取元数据。这可以很容易地通过调整docfx.json配置来实现,如下所示:

代码语言:javascript
复制
{
  "metadata": [
    {
      "src": [
        {
          "files": "bin/Release/net6.0/{AssemblyName}.dll",
          "src": "C:\\Users\\{User}\\.nuget\\packages\\{Package}\\{Version}\\lib\\net6.0\\"
        }
      ],
      "dest": "api/{AssemblyName}"
    }
  ]
  …
}

当然,这很管用。但是它也是一个非常脆弱的解决方案,对于生产代码来说是不可行的。最值得注意的是,DocFx不识别%UserProfile%别名,因此必须将{User}硬编码到配置中。这不仅对于每个开发人员来说是不同的,而且在构建服务器上也是不同的。在非Windows环境中,这甚至是不考虑因素的。

更好的解决办法

考虑到这一点,更好的解决方案是指示msbuildbin文档与程序集一起复制到bin文件夹。幸运的是,这非常容易,正如在如何在csproj构建输出中包含Nuget包中的XML文档中讨论的那样。在您的csproj文件中,只需添加以下内容:

代码语言:javascript
复制
<Project>
  <Target Name="_ResolveCopyLocalNuGetPkgXmls" AfterTargets="ResolveReferences">
    <ItemGroup>
      <ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->'%(RootDir)%(Directory)%(Filename).xml')"
      Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)'!='' and Exists('%(RootDir)%(Directory)%(Filename).xml')" />
    </ItemGroup>
  </Target>
</Project>

这种方法的主要优点是它依赖msbuild变量来抽象NuGet缓存的位置、包名、版本号和目标文件夹。因此,这应该适用于任何机器或操作系统。

这样,DocFx将成功地在程序集旁边找到XML文档,并将其包含在生成的yml元数据中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70602507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档