我有一个包含多个存储库的产品,每个存储库都是作为NuGet包分发的。我想为DocFx建立一个单独的存储库,它从NuGet包生成文档。这样,它可以将多个{存储库、项目、包}的文档合并到一个位置,同时允许独立于包发布周期更新概念文档。
TL;DR: I能够让DocFx基于NuGet包中的程序集正确地生成参考文档,但它不包含任何documentation (即从///元数据)。我该怎么解决这个问题?详情如下。
源包配置
为了实现这一点,我首先确保源项目的csproj文件配置为生成XML文档,作为构建输出的一部分:
<Project>
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
</Project>因此,nupkg文件正确地包含XML文档,例如:
/lib/net6.0/{AssemblyName}.xml然后,当使用这些包时,例如Visual就会获取这些文档。
DocFx配置
然后我通过metadata配置文件为这些程序集添加了docfx.json:
{
"metadata": [
{
"src": [
{
"files": "bin/Release/net6.0/{AssemblyName}.dll"
}
],
"dest": "api/{AssemblyName}"
}
]
…
}在此基础上,DocFx正确地标识名称空间、类型和成员,并为每个名称生成参考文档。到现在为止还好!
问题
问题是DocFx不包含这些程序集的任何XML (///)信息,尽管包中包含了它们。我该如何减轻这种情况呢?
发布于 2022-01-06 04:33:26
如果在metadata配置中指定程序集,DocFx将在同一个目录(来源)中查找documentation。但是,问题在于,当您包含NuGet引用时,项目的bin文件夹中没有包含XML,即使它包含在NuGet包中。因此,虽然DocFx能够识别结构,但它无法识别文档。
TL;DR:为了解决这个问题,您可以配置msbuild将XML复制到bin文件夹,确保DocFx能够访问它(示例)。详情如下。
背景
默认情况下,当引用NuGet包时,包将被下载、解压缩并缓存在以下位置:
%UserProfile%\.nuget\packages\{Package}\{Version}\注意:这显然是一个Windows目录;位置将因操作系统而异。
这将包括例如,
\lib\net6.0\{AssemblyName}.dll
\lib\net6.0\{AssemblyName}.xml构建.NET项目时,{AssemblyName}.dll将复制到项目的bin目录,而不是{AssemblyName}.xml。由于您已经指示DocFx查看您的项目的bin文件夹,因此它无法收集文档。
天真的解决办法
显而易见的解决办法是直接从NuGet缓存中获取元数据。这可以很容易地通过调整docfx.json配置来实现,如下所示:
{
"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环境中,这甚至是不考虑因素的。
更好的解决办法
考虑到这一点,更好的解决方案是指示msbuild将bin文档与程序集一起复制到bin文件夹。幸运的是,这非常容易,正如在如何在csproj构建输出中包含Nuget包中的XML文档中讨论的那样。在您的csproj文件中,只需添加以下内容:
<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元数据中。
https://stackoverflow.com/questions/70602507
复制相似问题