mkdocs使用说明¶
新手注意事项
请务必留意文档中的红色和橙色的提示,这些提示是非常重要的,如果你不理解,可以发到群里求助。
阅读本文档之前你需要了解的...
- 本文档使用Markdown语法,如果你不熟悉,请先学习一下Markdown语法。
- 文档使用git作为版本管理工具,如果不熟悉可以先阅读一下Git教程。
- 做一下demo-repo的练习
新手初次使用建议
阅读和实践流程:
- 先阅读Git教程,了解版本管理和协作
- 大致了解Markdown语法
- 安装好git,vscode和vscode的office viewer插件
- 阅读“如何本地部署文档”部分,按步骤操作,部署文档
- 阅读“如何本地运行文档”部分,按步骤操作,在浏览器中成功预览文档
- 阅读“如何新建文档”和“如何修改文档和提交”两部分,然后按照 如何修改文档和提交 部分的步骤操作,尝试修改文档并提交
下面有一些涉及命令行的操作,我该怎么做?
如果不知道命令行是什么,建议百度,关键词:什么是命令行
- 如果你是windows系统,可以使用
git bash
,也可以使用powershell
(推荐)。 - 如果你是linux系统,那你不可能不知道怎么做。
介绍篇(非必读)-------------------¶
什么是mkdocs?¶
mkdocs是一个静态网站生成器,它使用Markdown语法编写文档,然后使用mkdocs生成静态网站。
为什么要用这个文档?¶
文档的重要性————ChatGPT
技术团队的文档对于技术传承和内部接口协调都有着非常重要的作用。首先,技术团队的文档可以记录下技术团队在项目中所使用的技术、工具、流程等信息,方便后来的团队成员快速了解项目的背景和现状,从而更快地适应团队工作。此外,技术团队的文档还可以记录下项目中的问题、解决方案以及经验教训等信息,方便后来的团队成员避免重复犯错,提高工作效率。
另外,技术团队的文档也对内部接口协调有着重要的作用。在一个大型项目中,不同的团队可能会负责不同的技术模块,这些模块之间需要进行协调和交互。如果各个团队之间缺乏有效的沟通和协调,可能会导致模块之间出现不兼容、接口不清晰等问题,从而影响项目的整体进度和质量。而技术团队的文档可以记录下各个模块之间的接口、数据格式、调用方式等信息,方便各个团队之间进行协调和交互,避免出现不必要的问题。
综上所述,技术团队的文档对于技术传承和内部接口协调都有着非常重要的作用。通过记录下项目的技术、工具、流程等信息,方便后来的团队成员快速了解项目的整体情况,避免重复工作和浪费时间。同时,技术团队的文档还可以帮助团队成员更好地理解项目的业务需求和技术实现,提高团队成员的工作效率和质量。
————Generated by ChatGPT
有哪些基本的功能?¶
- markdown 语法支持(包括数学公式,代码、表格等,详情见Material for MkDocs | Reference)
- 搜索
评论区互动- 用户反馈统计以及Google Analytics访问量统计
- 更多功能描述请见文档框架设计文档
如何最快地上手?¶
最简单的方法就是多尝试。(本文章使用了大部分常用的功能,可以作为参考)
使用篇(必读)-------------------¶
如何本地部署文档?(初次使用)¶
什么叫文档部署?
文档部署就是将文档生成静态网页的过程。你本地部署文档后,浏览器打开 http://127.0.0.1:8030 就可以看到预览网页了。
本教程提供三种部署方式,对比如下:
方法 | 部署便捷度 | 性能 | 可开发性 | 备注 |
---|---|---|---|---|
docker | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | 自动安装所有依赖,一键部署,只需要安装docker。缺点是预览网页刷新慢。 |
原生python | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | 需要安装python和相关依赖 |
anaconda | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 需要安装anaconda、配置环境变量、创建虚拟环境、安装依赖 |
(所有方法都只需部署一次,以后一直用就行)
-
基础软件安装和配置
安装git:https://git-scm.com/downloads 下载。如果你用Windows,下载Standalone Installer: 64-bit Git for Windows Setup.
github ssh登录配置:必应搜索:github ssh免密登录配置,打开任意一篇教程,按照教程操作即可。
那个黑色窗口(终端)是怎么打开的
安装完成git后,右键点击桌面,选择
Git Bash Here
即可打开终端。 -
克隆仓库(执行以下命令,如果让你输入
[yes/no]
,输入yes
即可) -
配置部署软件
下载并安装docker:https://www.docker.com/products/docker-desktop
更多详细内容参考菜鸟教程:https://www.runoob.com/docker/windows-docker-install.html
下载并安装python:https://www.python.org/downloads/
- 下载并安装anaconda:https://www.anaconda.com/products/individual
-
配置环境变量:
-
如果你是windows环境:用管理员权限打开powershell,输入
set-executionpolicy remotesigned
- 创建一个虚拟环境:
conda create -n docs_env
- 激活虚拟环境:
conda activate docs_env
- 安装pip:
conda install pip
-
进入到文档文件夹下,进一步配置
-
过一会,等文档构建完打开浏览器,输入
http://127.0.0.1:8030/
,即可看到文档。
原理
运行mkdocs serve
后,会在本地启动一个mkdocs
服务。打开浏览器访问的http://127.0.0.1:8030/
是一个环回地址,即访问本机的8030端口。mkdocs
服务会监听8030端口,当访问该端口时,会返回mkdocs
生成的静态网页。这个是本地运行的文档,你的修改按Ctrl+S
保存后,浏览器会自动刷新,你就可以看到修改后的效果了。
如何新建文档?¶
Markdown编辑器的选择(初次使用)
常用的编辑器有Typora
、vscode
等,Typora
是很受欢迎的一款Markdown编辑器,但由于近期要收费,请自己找一下解决办法。
一个免费的替代是vscode
+Office Viewer
插件。vscode
的Office Viewer
插件能带来类似于Typora
的所见即所得的编辑体验。
关于这几个软件/插件的安装方法,请自行百度。
如果你使用的是Typora,我建议你每次新建文档、编辑文档前设置一下默认图片文件夹,使新文档的图片资源文件位置和历史文档保持一致,避免混乱。
- 在
docs/
目录下新建.md
文件 - 然后在
mkdocs.yml
的nav
中添加新的文档路径和标题
注意yaml语法
yaml语法中,每一级缩进都必须是 两个空格 ,不要使用tab键!
以下是一个例子:
如何修改文档和提交(基础)¶
以下是一个从创建有限状态机介绍.md
到提交的完整例子:
1.新建分支
一定要执行新建分支这一步!
如果大家都直接都在main
分支上提交会导致历史混乱,不方便管理。
如果擅自在main
分支上修改还不听劝阻,那我只能收回你的写权限了,你以后就老老实实fork+pull request吧。
2.新建文档并编辑
3.配置文件中新增一个栏目
4.提交并推送
git add . # 添加所有修改
git commit -am "新建了FSM介绍文档" # 提交到本地仓库
git push origin lcf_update # 推送到远程仓库的lcf_update分支
5.在github上发起Pull Request,合并PR
然后基本上就可以了。
6.合并PR后,更新本地文档,并删除本地分支和远程分支
git checkout main # 切换到main分支
git pull # 更新本地文档,使其与远程文档main分支同步
git branch -d lcf_update # 删除本地分支(因为main分支已经更新到最新,而lcf_update分支作用是个人临时编写文档使用的,所以编辑完成了就可以删除)
git push origin --delete lcf_update # 删除对应的远程分支
为什么我提交了文档,但并没有出现在文章末尾的作者列表中?
原因在于,本地的git config
中设置的是邮箱A,而GitHub上关联的是邮箱B,因此GitHub并不认为你是contributor。
解决方法是:在GitHub上关联邮箱A,或者在本地的git config
中设置邮箱B。
如何解决冲突?(进阶)¶
冲突是什么?何时产生?
当两个人同一时间段修改了同一个文件,就会产生冲突。
以下是一个完整的例子:
比如我和杨昕明在同一时间段先后从main分支上新建了各自的分支,打算同时修改mkdocs使用说明.md
文件。过程如下:
我先提交了PR并成功合并进了main分支。
杨昕明在我提交PR之后,修改好了mkdocs使用说明.md
文件,推送了自己的分支yxm_update
后,发起了PR。
然后发现了冲突。根本原因是:git并不知道到底应该选择我的版本还是杨昕明的版本,所以就会提示冲突。 接下来我们使用GitHub自带的编辑器手动选择保留谁的哪一部分内容。解决流程如下图所示:
冲突至此就成功化解。后续的操作和之前一样,合并PR,更新本地文档,删除本地分支和远程分支即可。
总结一下,冲突是如何产生的可以这样理解:
(DEPRECATED)如何更新对外开放的stable
分支?(进阶)¶
DEPRECATED
目前这一部分使用GitHub workflow自动与main
分支同步,不需要手动更新了,但基本原理没有改变。因此本节内容废弃,仅作了解。
注意
以下操作如果操作不当可能会造成内部文档的泄露以及git仓库的混乱,所以请按照步骤谨慎操作。(初次操作请先联系会的人看着你操作)
原理
stable
分支是对外开放的,只包含public.yml
中指定的内容,因此需要使用脚本prune.py
将不开放的内容从stable
分支中删除。
for root, dirs, files in os.walk("./docs"):
for file in files:
path = os.path.join(root, file)
# replace backslashes with forward slashes
path = path.replace("\\", "/")
# remove the ./ prefix if it exists
path = path[2:] if path.startswith("./") else path
if not is_public(path): # if the file is not public, delete it
print(f"rm:{path}")
os.remove(path) # delete the file
with open(path, 'w', encoding='utf-8') as f: # replace original file with redirection template
f.write(redirection_template(get_suffix(path)))
由于prune.py
脚本会将stable
分支中不开放的内容从git索引中删除,这会造成一个问题:进行git merge main
操作时,stable
分支中曾经删除的内容将会被忽略,不会被合并到stable
分支中。这可能会造成stable
分支中的内容与main
分支中的内容不一致(stable
部分文件缺失)。
因此需要将stable
分支的内容首先回退到与main
分支的最新公共祖先的状态,再进行合并操作。
当stable
分支已经回退到与main
分支的最新公共祖先的状态后,仅仅只需要将main
分支的最新内容同步到stable
分支上即可,因此使用fast-forward
模式进行合并。
关于fast-forward
模式的详细介绍可以参考1。
操作步骤:
- 首先和每个组商量好哪些内容是对外开放的,将这些内容写入
main
分支的public.yml
中。 -
将
main
分支的内容合并到stable
分支上。a. 更新
stable
分支。如果stable
分支曾经删除过某些文件(使用过剪枝脚本prune.py
),则需要先将stable
分支的内容恢复到main
分支的状态,再进行下一步操作。b. 将git checkout stable # 切换到stable分支 git reset --hard $(git merge-base main stable) # 将stable分支更新到与main分支的最新公共祖先
main
分支的内容合并到stable
分支上。 -
运行剪枝脚本,删除不对外开放的内容。
- (可选) 修改
mkdocs.yml
的nav
标签,使网站的导航栏目能按需求显示文章标签。具体方法见上文。 - 提交并推送到远程仓库。
番外篇(选修)-------------------¶
如何开启评论区?¶
根据有关规定,公开内容禁止开放评论区!
在文档开头的fontmatter
中添加comments: false
即可。
一些常用功能¶
公式¶
内联公式:\(a^2+b^2=c^2\)
代码¶
表格¶
语法 | 说明 |
---|---|
# |
一级标题 |
## |
二级标题 |
### |
三级标题 |
Admonitions¶
具体使用请参考这里
参考文献¶
既可以直接指定参考文献,也可以使用bibtex格式的参考文献。
使用bibtex格式的参考文献可以方便地管理参考文献,只需要在bibliography
中添加参考文献的bib文件,然后在文档中引用即可。
像LaTeX2一样写Markdown参考文献。
@article{gpt3,
title={Language Models are Few-Shot Learners},
author={Brown, Tom B and Mann, Benjamin and Ryder, Nick and Subbiah, Melanie and Kaplan, Jared and Dhariwal, Prafulla and Neelakantan, Arvind and Shyam, Pranav and Sastry, Girish and Askell, Amanda and others},
journal={arXiv preprint arXiv:2005.14165},
year={2020}
}
思维导图¶
详情参考:https://github.com/markmap/mkdocs-markmap
Draw.io支持¶
详情见:https://github.com/onixpro/mkdocs-drawio-file/
mkdocs material的详细使用说明(非必读)¶
一些Feature请参考这里。
开发者幕后(非必读)¶
开发者幕后
最初是想通过飞书文档来管理内部文档,但飞书文档不支持导出为Markdown,怕万一哪一天突然要收费了,就没法导出了,所以就想着自己部署一个文档。
当时的基本需求是:
- 编写文档要足够简单,不需要太多的学习成本。最好是能直接使用Markdown语法。
- 支持的内容足够丰富,要能支持公式、代码、表格、图片等。
- 功能要足够强大,最好能有搜索功能,能够自动生成目录,能够自动生成导航栏。
- 能够方便地多人合作。
初步的想法是使用mkdocs
+mkdocs-material
+github pages
,但是github pages
是全部对外开放,有些内部文档不支持访问认证,而Github企业版要收费,所以就想办法进行了一点workaround。
现在采用的方案是mkdocs
+mkdocs-material
作为基本的文档生成工具,用github actions
自动部署到gh-pages
分支,然后从云服务器上定时拉取gh-pages
分支的内容。
权限管理方面,使用了mike
这个工具,它可以将mkdocs
生成的文档分成多个版本。我将文档划分为内部使用的dev
版本(也就是main
分支),以及对外开放的stable
版本(也就是stable
分支)。注意到访问内部dev
版本时,uri中会带有/dev/
,所以通过nginx
添加一个basic auth
,访问/dev/
时需要输入用户名和密码,而访问/stable/
时则不需要。
当时折腾nginx
花费了一些精力。主要是当时的SSL证书不支持通配符,所以我需要配置较为复杂的转发规则才能正常使用文档(将请求都转发到/paa_docs/
下)。其中遇到了301重定向的问题、静态资源找不到的问题等等。
后来用了Let's Encrypt的免费证书,直接上通配符证书+二级域名,彻底解决了这个问题。
目前增加了documentation-deploy
仓库,方便以submodule
的形式将其它API文档一同进行部署。
最后的话¶
如果还想进一步深入了解幕后的原理,可以参考文档框架设计文档.
希望大家积极参与到文档的编写中来,共同维护好这个文档。文档中留下的是你的足迹,也是你的贡献。
References¶
-
Leslie Lamport. I1 (\LaTeX)—A Document. Volume 410. pub-AW, 1985. ↩