.NET6使用DOCFX根据注释自动生成开发文档

本文内容来自我写的开源电子书《WoW C#》,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master · sogeisetsu/WOW-Csharp (github.com)来查看编写进度。预计2021年年底会完成编写,2022年2月之前会完成所有的校对和转制电子书工作,争取能够在2022年将此书上架亚马逊。编写此书的目的是因为目前.NET市场相对低迷,很多优秀的书都是基于.NET framework框架编写的,与现在的.NET 6相差太大,正规的.NET 5学习教程现在几乎只有MSDN,可是MSDN虽然准确优美但是太过琐碎,没有过阅读开发文档的同学容易一头雾水,于是,我就编写了基于.NET 5的《WoW C#》。本人水平有限,欢迎大家去本书的开源仓库sogeisetsu/WOW-Csharp关注、批评、建议和指导。

注意,本文所讲的API,为基于对代码注释而自动生成的开发文档,API内容为代码中内类及成员的解释,并非Web API或者REST API。

DOCFX

在团队开发过程中,一个漂亮的开发文档是至关重要的,它有助于帮助人们快速地理解项目。DOCFX是一个搭建开发文档网站和根据注释生成api文档的工具。DOCFX极其强大,自定义程度极高,缺点是自动化程度不高,使用起来略显麻烦,比如已经2021年了,官方竟然还不支持自动生成目录,好在其有很多与其相关的开源项目,可以一定程度上弥补它的缺憾。如果将DOCFX用好了,它就不仅仅是API文档生成器,还是一个简单的博客网站构建器,DOCFX由微软旗下的dotnet开源,微软的MSDN的构建就用到了DOCFX。遗憾的是DOCFX目前官方只支持.Net和JavaScript,但是它提供了Generate Metadata的步骤,理论上它可以支持任何语言(DocFX is designed to support any language),GitHub上基本上常见的语言都有针对DOCFX的开源项目。本文对DOCFX的讲解不及其功能的十分之一,但是基本上可以应对日常的需要,如果想要进一步了解DOCFX,请前往DocFX - static documentation generator | DocFX website (dotnet.github.io)。本文所使用由DOCFX生成的API文档项目可以前往sogeisetsu/WOW-Csharp at docfx_example (github.com)查看源码。

第一步 生成简单的文档网站

前往Releases · dotnet/docfx (github.com)下载最新版的DOCFX。将其加入环境变量,这样为了方便起见,docfx 命令可以直接从任何地方调用。(例如,对于 Windows,设置 PATH =%PATH%;d:docfx)。

  1. 运行docfx init-q。这个命令生成一个 docfx_project 文件夹,其下面有默认的 docfx.json 文件。Json 是 docfx 用来生成文档的配置文件。-q 选项意味着使用默认值悄悄地生成项目,您也可以尝试 docfx init,并按照说明提供自己的设置。

  2. 运行命令 docfx docfx_project/docfx.json。请注意,在该文件夹下生成了一个新的子文件夹 _site。这是生成静态网站的地方。

  3. 运行docfx serve docfx_project/_site就可以从http://localhost:8080查看生成的网页。如果未使用端口 8080,docfx 将在 http://localhost:8080 下托管 _site。如果8080正在使用,可以使用docfx serve _site -p <port>更改docfx使用的端口。

  4. 14613994be6c225f29967c1b6ff84ff3.png

向网站添加文章

在进行初始化和创建网站之后,当前的docfx_project文件结构应该是这样的:

.
├── _site
├── api
├── apidoc
├── articles
├── docfx.json
├── images
├── index.md
├── obj
├── src
└── toc.yml

各个文件和文件夹的作用如下:

/ - 这个网站的根目录,包含:

  • docfx.json - docfx 依赖的配置文件。所有的命令及其涉及到的文件都会用docfx.json来配置。

  • index.md - 用来创建网站的首页。

  • toc.yml – 呈现为导航菜单栏,显示在网站每个页面的顶部。

/articles - 里面放着一些markdown文件。这些markdown文件的图片放在/images下。这些 Markdown 文件发布在菜单栏的Ariticles部分下。

/src - 包含可选的 .NET 语言项目文件 (*.csproj),其中包含用于生成托管 API 文档的类型信息。

/apidoc - 包含用于覆盖根据注释中自动生成的文本的 Markdown 文件。

运行 DocFx 后,将创建其他文件夹:

/_site - 包含由 DocFx 生成的所有站点文件,包括网站所需的生成的 HTML/JSON/JS/Images 文件。

修改首页

可以修改根目录下的index.md来修改网站的首页

ac45e6f6edfe718ab07baca181c081ed.png

将更多的文章放到网站

  1. 将更多.md文件放入articles,例如快速开始.md演练.md进阶.md。如果文件引用了任何资源,请将这些资源放入images文件夹中。

  2. 为了组织这些文章,我们将这些文件添加到/articles/toc.yml(也可以使用工具Release 用于自动生成docfx文档 · whuanle/CZGL.DocfxBuild.Yml (github.com)自动生成目录)。内容toc.yml如下:

    - name: 快速开始href: intro.md
    - name: 演练href: 演练.md
    - name: 进阶href: 进阶.md

    现在articles文件夹的布局是:

    .
    ├── intro.md
    ├── toc.yml
    ├── 演练.md
    └── 进阶.md
  3. docfx_project文件夹下运行docfxdocfx serve _site,然后就可以看到已经有文章加入:

    33e7ce365200200df2bd846e1887045c.png

修改导航菜单栏

ad681dc18f68a9579662d083b217ef02.png

导航菜单栏默认有两个选项,分别是ArticlesAPI Documentation,可以通过修改根目录下的toc.yml来修改导航菜单栏的名称:

- name: 开始href: articles/
- name: Api 文档href: api/# homepage来定义api的首页homepage: api/index.md

1fd11f9a9b532da027de0c21a2cfb9eb.png

也可以向导航菜单栏增加新的选项,比如说,在根目录新建一个文件夹,命名为blog,该文件夹结构如下:

.
├── GIT 的merge、rebase和cherry-pick.md
├── Google Fonts注意事项.md
├── Linux笔记.md
├── issue trans Problem Description.md
├── python 包(package)和模块(module)的创建和引入(import).md
├── toc.yml
├── unix bsd linux shell bash GNU之间的联系,歪讲Linux(一).md
├── vscode git 无需命令行.md
├── 一.md
├── 关于若干问题的解释说明.md
├── 商品上架格式.md
├── 如何在印刷品中使用遵循SIL Open Font License协议的字体.md
├── 对微信支付文档的自我理解.md
├── 我的python加密方案.md
├── 找人.md
├── 日语 时间的量.md
├── 日语学习资源的分享.md
├── 说明.md
├── 贝多芬小传.md
├── 还没有学会告别,就已经后会无期。.md
├── 雷电接口.md
└── 青岛科技大学新生报考参考.md

在该文件夹内添加toc.yml,内容如下:

### D:\blog
- name: GIT 的merge、rebase和cherry-pickhref: GIT 的merge、rebase和cherry-pick.md
- name: Google Fonts注意事项href: Google Fonts注意事项.md
- name: issue trans Problem Descriptionhref: issue trans Problem Description.md
- name: Linux笔记href: Linux笔记.md
- name: python 包(package)和模块(module)的创建和引入(import)href: python 包(package)和模块(module)的创建和引入(import).md
- name: unix bsd linux shell bash GNU之间的联系,歪讲Linux(一)href: unix bsd linux shell bash GNU之间的联系,歪讲Linux(一).md
- name: vscode git 无需命令行href: vscode git 无需命令行.md
- name: 一href: 一.md
- name: 关于若干问题的解释说明href: 关于若干问题的解释说明.md
- name: 商品上架格式href: 商品上架格式.md
- name: 如何在印刷品中使用遵循SIL Open Font License协议的字体href: 如何在印刷品中使用遵循SIL Open Font License协议的字体.md
- name: 对微信支付文档的自我理解href: 对微信支付文档的自我理解.md
- name: 我的python加密方案href: 我的python加密方案.md
- name: 找人href: 找人.md
- name: 日语 时间的量href: 日语 时间的量.md
- name: 日语学习资源的分享href: 日语学习资源的分享.md
- name: 说明href: 说明.md
- name: 贝多芬小传href: 贝多芬小传.md
- name: 还没有学会告别,就已经后会无期。href: 还没有学会告别,就已经后会无期。.md
- name: 雷电接口href: 雷电接口.md
- name: 青岛科技大学新生报考参考href: 青岛科技大学新生报考参考.md

修改根目录的toc.yml,将blog文件夹加进去:

- name: 开始href: articles/
- name: Api 文档href: api/homepage: api/index.md
- name: 博客href: blog/homepage: blog/GIT 的merge、rebase和cherry-pick.md

然后修改根目录下的docfx.json,这是依赖的配置文件。关于它的用法后面再讲,在docfx.json修改build的content下添加:

{"files": ["blog/**.md","blog/**/toc.yml","toc.yml","*.md"]
}

docfx_project文件夹下运行docfxdocfx serve _site,然后就可以看到已经有文章加入:

8f3748adb70347cc58d023773a412549.png

第二步 向网站添加 API 文档

向/src文件夹下添加一个c#项目,要包含csproj文件。

├── src├── ConsoleApp1.csproj├── Program.cs├── bin├── newLei.cs└── obj

docfx_project文件夹下运行docfxdocfx serve _site,然后就可以看到已经有根据注释自动生成的API文章加入:

99723a9ac6d44f84d6500d7d13e13e22.png

在左侧导航加入其他文件夹的内容

当前的根目录下的toc.yml是这样的:

- name: 开始href: articles/
- name: Api 文档href: api/homepage: api/index.md
- name: 博客href: blog/homepage: blog/GIT 的merge、rebase和cherry-pick.md

这表示开始这一菜单下只会包含articles文件夹下面的内容。

现在在根目录新建一个文件夹,命名为anycombine,在该文件夹下面放置一个toc.yml,内容如下:

- name: Articleshref: ../articles/toc.yml
- name: Bloghref: ../blog/toc.yml

然后修改根目录下的toc.yml:

- name: 开始href: anycombine/
- name: Api 文档href: api/homepage: api/index.md
- name: 博客href: blog/homepage: blog/GIT 的merge、rebase和cherry-pick.md

最后在docfx.json里面添加anycombine文件夹,让其在创建网页时能够包含这个文件夹:

"build": {"content": [{"files": "anycombine/**"},

然后创建网站,网站上导航菜单栏中的开始选项包含articlesblog两个文件夹的内容:

edfd7c232cac7f282ae9ce5a48b892ea.png

导出为PDF文档

之前已经讲解了如何生成网站,现在讲解如何将网站上面的内容转为PDF,先下载一个开源工具 wkhtmltopdf,可以前往wkhtmltopdf根据自己电脑的规格来选择版本。安装或解压之后,将其放置在环境变量,方便以后调用,可以在power shell使用setx PATH "%PATH%;D:\wkhtmltopdf\bin"来将其放入环境变量。

然后在之前docfx生成的文件夹的根目录下创建一个文件夹,名为pdf,在里面创建一个toc.yml来包含需要生成PDF的目录:

- name: Articleshref: ../articles/toc.yml
- name: Bloghref: ../blog/toc.yml
- name: API 文档href: ../api/toc.yml

接下来,需要将pdf部分添加到docfx.json,只有这样,才能在执行docfx的时候来将其转换为pdf,增加一个pdf属性,docfx.json排除了 TOC 文件,因为每个 TOC 文件都会生成一个 PDF 文件,内容如下:

"pdf": {"content": [{"files": ["api/**.yml"],"exclude": ["**/toc.yml","**/toc.md"]},{"files": ["articles/**.md","articles/**/toc.yml","toc.yml","*.md"],"exclude": ["**/toc.yml","**/toc.md"]},{"files": ["blog/**.md","blog/**/toc.yml","toc.yml","*.md","pdf/*"],"exclude": ["**/toc.yml","**/toc.md"]},{"files": "pdf/toc.yml"}],"resource": [{"files": ["images/**"]}],"overwrite": [{"files": ["apidoc/**.md"],"exclude": ["obj/**","_site/**"]}],"wkhtmltopdf": {"additionalArguments": "--enable-local-file-access"},"dest": "_site_pdf"
}

然后在docfx项目的根目录运行docfx,就可以在_site_pdf文件夹看到pdf文件了。提示:这一过程可能会花费比较长的时间,建议喝杯咖啡等待。

deef057b0857f4f3822b2642d7bd1563.png

其实,说实话,html的表现效果一定要比PDF文件强,这个是毋庸置疑的。

DOCFX 常用命令

现在根据docfx.json中的设置,有下面几个命令(之所以放到这里说是因为易懂性方面的考虑):

  • docfx metadata 根据src目录下的项目来修改api文件夹的内容,即生成API文档。

  • docfx build 生成网站源码,文件放在_site文件夹下。

  • docfx serve <_site文件夹位置> 创建本地服务器,可以本地访问API网站内容

  • docfx pdf 导出PDF。

  • docfx 执行docfx metadatadocfx builddocfx pdf

应该可以看到,DOCFX的命令的内容甚至是作用都和docfx.json中的配置是息息相关的,这个配置文件其实很好理解,主要记住content属性会规定命令会波及到哪些文件和会放过那些文件其实就可以了。遇到别的需求可以查阅docfx.exe User Manual | DocFX website (dotnet.github.io),里面详细地记载了docfx.json中每个属性的作用。

自定义

template

运行命令docfx template list,可看到内置的模板列表:

Existing embedded templates are:commondefault(zh-cn)defaultpdf.defaultstatictoc

可以在docfx.json中的build属性的template属性中设置模板:

"template": ["default(zh-cn)"
],

也可以在命令行中进行类似-t statictoc的操作,比如使用docfx build -t statictoc之后的网站是一个静态网站,可以通过本地文件系统预览而非服务器环境。

c1e121dfdc0a25ebd68b17055206ec72.png

导出template

使用docfx template export default可已导出默认的HTML模板,将有名为 _exported_templates 的文件夹添加到根目录下,其中包含名为default的文件夹,即default模板的HTML。

创建template

创建一个文件夹,比如templates,然后将导出的_exported_templates 中的default文件夹复制到templates中。

  • templates中的default现在就是创建的一个新的模板文件夹,可以修改其中的内容来自定义。

    • 修改partials/footer.tmpl.partial来修改页脚版权,建议只修改<span>Generated by <strong>DocFX</strong></span>部分来声明自己的版权,不要修改微软对DOCFX的版权。

      {{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}}<footer><div class="grad-bottom"></div><div class="footer"><div class="container"><span class="pull-right"><a href="#top">{{__global.backToTop}}</a></span>{{{_appFooter}}}{{^_appFooter}}<span>Copyright (c) 2021 苏月晟,版权所有。<br>通过<strong>DocFX</strong>生成</span>{{/_appFooter}}</div></div>
      </footer>
    • 有一个默认模板叫做default(zh-cn),可以将文档改为中文,在docfx.json将其放到里面来实现中文,并将自定义模板放到default(zh-cn)后面,因为在docfx.jsonbuildtemplate中是后面的覆盖前面的,这样就不用再一个个修改自己自定义的模板了。如果想自定义中文可以修改模板文件中的partials/title.tmpl.partialtoken.json两个文件来自定义中文名称。

      "template": ["templates/default","default(zh-cn)"
      ],
    • 对于修改图标和logo有两个方式,一个是参考docfx.exe User Manual | DocFX website (dotnet.github.io)在docfx.json中的"globalMetadata"进行修改,另一个是直接替换模板文件中的logo.svg和favicon.ico。可以修改partials\logo.tmpl.partial来取消class=“svg”从而取消logo的动画,并可以调整大小,这里附上我自己对partials\logo.tmpl.partial的修改,仅供参考。

      <a class="navbar-brand" href="{{_rel}}index.html"><img id="logo" src="{{_rel}}{{{_appLogoPath}}}{{^_appLogoPath}}logo.svg{{/_appLogoPath}}" height="46" width="46" alt="{{_appName}}" >
      </a>
    • 可以在docfx.json中的"globalMetadata"_enableSearch设置为true来增加搜索框,但是根据实验,docfx对中文搜索的支持很差。可以修改_appTitle来修改网站的标题。可以增加_gitContribute来设置Improve this Doc按钮。

    • 可以修改模板中的styles\docfx.vendor.css来自由发挥对css的修改,笔者的方式为先在浏览器中确定css选择器,然后再进行对应的修改。

  • 最终为了使我们创建的模板工作,应当在在docfx.jsonbuildtemplate中的来添加模板文件夹相对位置,为了显示中文,笔者还会使用一个默认模板叫做default(zh-cn)

    • "template": ["templates/default","default(zh-cn)"
      ],

最终的效果如下:

44fe1d38d2235b914777519351c45ffd.png

可以访问这是首页 | 演示文档制作 (sogeisetsu.github.io)来查看在这篇文章中笔者所创建的文档网站,可以在sogeisetsu/WOW-Csharp at docfx_example (github.com)查看文档网站的源代码和docfx配置文件。

LICENSE

已将所有引用其他文章之内容清楚明白地标注,其他部分皆为作者劳动成果。对作者劳动成果做以下声明:

copyright © 2021 苏月晟,版权所有。

本作品由苏月晟采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本文作者:苏月晟,转载请注明原文链接:https://www.cnblogs.com/sogeisetsu/p/15674507.html

我的开源电子书《WoW C#》正在编写中,欢迎去https://git.io/JMlrA 关注、批评和指导。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

量子力学到底神奇在哪里?看完这个,我的认知彻底坍塌了

▲ 点击查看很多朋友应该都看过Facebook创始人扎克伯格给他的女儿讲量子力学的那张照片。扎克伯格在清华大学经济管理学院做演讲时&#xff0c;曾谈到&#xff1a;学习量子力学改变了他的思维方式。到底什么是量子力学&#xff1f;我们生活面对的物质尺度大约是厘米级到千米级之…

linux 路由表设置 之 route 指令详解

使用下面的 route 命令可以查看 Linux 内核路由表。 [cpp] view plaincopy# route Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * …

黄老师离开呆了十年的上海

关注我的老朋友都知道&#xff0c;我和一线码农&#xff08;黄新成&#xff09;以前是同事&#xff0c;我以前也写过文章说过他的事迹。我们曾经一起共事过一家电商服务公司&#xff0c;每天和千万量级的数据打交道。.NET 圈的朋友想必很多人都看过一线码农写的技术文章&#x…

Shell配置_配置IP

1、setup 打开图形化页面a) 选择网络配置b) 选择设置配置c) 选择第一个网卡2、启动网卡&#xff08;第一个网卡&#xff09;vim /etc/sysconfig/network-scripts/ifcfg-eth0将ONBOOT"no"改为ONBOOT"yes"3、重启网络服务service network restart来自为知笔记…

linux之路由知识之ip route 命令中的疑惑

1.基础知识 1.1 路由 &#xff08;Routing&#xff09; 1.1.1 路由策略 &#xff08;使用 ip rule 命令操作路由策略数据库&#xff09; 基于策略的路由比传统路由在功能上更强大&#xff0c;使用更灵活&#xff0c;它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应…

python怎么执行程序_小鹅通视频怎么下载?用python实现小鹅通视频下载(二)

小鹅通视频怎么下载&#xff1f;用python实现小鹅通视频下载(二)背景上次分享《小鹅通视频怎么下载&#xff1f;用python实现小鹅通视频下载(一)[1]》后&#xff0c;引来了很多人咨询小鹅通视频怎么下载的问题。其实咨询的人大多是不懂python[2]语言的人&#xff0c;也有一部分…

在 Azure Functions 上使用不同的路由前缀

点击上方蓝字关注“汪宇杰博客”原文&#xff1a;Azure Tips and Tricks翻译&#xff1a;汪宇杰导语有时需要使用与 Azure Functions 自动生成的路由前缀不同的路由前缀。例如&#xff1a;https://mynewapimc.azurewebsites.net/api/HttpTriggerCSharp1 在函数名之前使用 api。…

RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总

2019独角兽企业重金招聘Python工程师标准>>> MQ框架非常之多&#xff0c;比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka。这几种MQ到底应该选择哪个&#xff1f;要根据自己项目的业务场景和需求。下面我列出这些MQ之间的对比数据和资料。 第一部分&#xff1a;Rab…

TMG学习(十一),保护企业内网上网安全

我们知道一个企业如果允许用户上网而且可以任意下载软件&#xff0c;这对于企业来说是非常危险的&#xff0c;用户无法辨别哪些是安全网站哪些网站存在风险&#xff0c;因此一旦用户在恶意网站上下载了软件&#xff0c;导致客户端中毒从而会影响整个企业内部网络&#xff0c;最…

sql跨表查询_跨表更新,看到自己写的SQL像个憨憨

有点 SQL 基础的朋友肯定听过 「跨表查询」&#xff0c;那啥是跨表更新啊&#xff1f;背景项目新导入了一批人员数据&#xff0c;这些人的有的部门名称发生了变化&#xff0c;有的联系方式发生了变化&#xff0c;暂且称该表为t_dept_members, 系统中有另外一张表 t_user_info 记…

iText创建一个含有中文的pdf文档

有朋友问我pdfbox支不支持向pdf文档中写入中文。然后试了好多遍都是有乱码&#xff0c;也找了好多资料没有找到解决办法。 但是在查找资料的过程中发现了另一个处理pdf的开源库iText.官方介绍 http://itextpdf.com/ 在这参考了两篇博客 博客1.pdfbox&iText生成PDF文件格式及…

万字长文 - 解读功能开关 | IDCF

原文&#xff1a;https://martinfowler.com/articles/feature-toggles.html作者&#xff1a;Pete Hodgson译者&#xff1a;冬哥功能开关Feature Toggle&#xff08;通常也称为功能标志Feature Flag&#xff09;是一种强大的技术&#xff0c;允许团队在不更改代码的情况下修改系…

2000多一件的大牌T恤,真实成本有多少?

▲ 点击查看喜大普奔&#xff0c;2021年度T恤大战总算是要在全国范围揭幕了。夏天的T恤永远不嫌多&#xff0c;基础款、印花款&#xff0c;从入春以来我们商城也陆陆续续上架了不少。但始终还有一些空白尚未填补&#xff0c;例如我们一直想给大家再找一些看起来上档次、穿起来显…

linux之使用indent格式化代码总结

1、介绍indent indent是一个整理代码的工具,不管你的代码写得多乱,你用indent工具都会把你的代码风格和linux 内核代码一致,基本上每个linux 发布都可以找到或者自己安装 sudo apt-get install indent 2、indent具体详细地址 比如在我的电脑上地址图片如下 所以地址在 /us…

使用 Dapr 缩短软件开发周期

Microsoft DevOps 文档里的文章&#xff08;https://docs.microsoft.com/zh-cn/azure/devops/report/dashboards/cycle-time-and-lead-time?viewazure-devops&#xff09;中的这张图片在给我们介绍了 什么是周期时间 以及它如何影响我的项目流时非常有影响力。第一次输入 &quo…

linux之写C代码出现warning: format not a string literal and no format arguments [-Wformat-security]

今天编写c语言代码的时候出现下面错误 解决办法&#xff1a; 把printf("length is %d" length);改成 printf("length is %d", length); 以后特么不要 像傻逼换这种错误&#xff0c;日来狗&#xff0c;写java代码写习惯了&#xff0c;不能动不动就是。