使用MkDocs管理你的CMS系统
0x00 关于Sphinx和MkDocs
托管文档除了用Jekyll管理你的Github Pages外,https://readthedocs.org/也是使用的非常多,上面托管的文档用Sphinx构建的比较多,文档也是比较复杂的,这里我们介绍一个非常好用的工具:MkDocs。
MkDocs是研究Hyperledger的时候发现的一个工具,使用方法和配置都非常的简单,能够不用太关心建站的事情,能够聚焦到文档本身,看这个文章的长短就知道了。
0x01 安装和使用MkDocs
以下的操作步骤都按最简单的写,详细一点的配置参考官方文档。
- 安装MkDocs
pip install mkdocs
- 创建文档工程
可以直接用mkdocs的命令:
mkdocs new my-project
cd my-project
生成的目录结构如下:
xxx
├── docs
│ └── index.md
└── mkdocs.yml
1 directory, 2 files
mkdocs.yml是配置文件,默认的配置项只有一个site_name:
site_name: My Docs
index.md的内容是一个mkdocs的使用说明:
# Welcome to MkDocs
For full documentation visit [mkdocs.org](http://mkdocs.org).
## Commands
* `mkdocs new [dir-name]` - Create a new project.
* `mkdocs serve` - Start the live-reloading docs server.
* `mkdocs build` - Build the documentation site.
* `mkdocs help` - Print this help message.
## Project layout
mkdocs.yml # The configuration file.
docs/
index.md # The documentation homepage.
... # Other markdown pages, images and other files.
- 配置MkDocs
直接修改mkdocs.yml就可以,比如:
- site_name:站点的名称 比如我们的是这么设置的:
- pages: 导航页面
- theme: 站点主题
- docs_dir: Markdown文档目录
- site_dir: 生成的静态网页目录
- dev_addr: 本地调试的监听地址和端口
- markdown_extensions: 一些扩展
更多的配置项参考官方文档。
我们的一个工程是这么设置的:
site_name: 基于Hyperledger的基金管理
site_url: https://wutongtree.github.io/funds/
theme: simplex
site_description: '基于Hyperledger的基金管理'
docs_dir: markdowns
site_dir: docs
pages:
- 首页: index.md
- 功能描述: requirements.md
- 设计实现: designs.md
- 安装部署: deploy.md
markdown_extensions:
- extra
- tables
- toc
- fenced_code
- smarty
- mdx_math:
enable_dollar_delimiter: True
- footnotes
copyright: Copyright © 2014-2016 <a href="https://wutongtree.com" target="_blank">wutongtree.com</a>
0x03 写文章
直接在docs目录下写Markdown文档就可以,也可以创建子目录,方便文档管理。 MkDocs对Markdown文档没有侵入性,完全按照标准的格式写就可以了,不像Jekyll一样需要加一些文件头什么的,文档的链接也可以直接链接原始的Markdown文档,最终生成静态网页的时候会替换成最终的html页面。
0x04 本地测试
运行命令:
mkdocs serve
然后打开链接http://127.0.0.1:8000就可以预览了,它会监控本地页面的修改,所以一边改一边就能看到最终的效果了。
0x05 生成静态网页
运行命令:
mkdocs build
就会在site目录下看到生成的静态网页了,可以托管到任何一个空间服务商那里了。这个目录也是可以修改的,比如Github Pages用的docs目录,就可以在MkDocs里面改下。
0x06 解析没有在pages列表中的页面
官方的版本中,没有在mkdocs.yml配置文件的pages选项中出现过的页面不会转换为静态页面,也不能被其他页面链接。类似这样的错误或者警告:
WARNING - The page "hyperledger/index.md" contained a hyperlink to "hyperledger/chaincode.md" which is not listed in the "pages" configuration.
这其实是他们的设计,因为他们还专门有一个选项strict来说这个事情,如果有这种链接错误的话,要不要终止构建啊 :(
可是有的链接我确实不需要出现在导航栏,直接出现在页面的链接中就好了,否则我增加一个页面就要增加一个导航页面,文章多了就比较麻烦了。
如果你也需要这个功能,可以用我们修改的一个版本:
git clone https://github.com/wutongtree/mkdocs.git
cd mkdocs
sudo python setup.py install
修改的版本已经给官方提交了pull request,估计是不会通过的 :)
0x07 错误
如果发现错误:
Traceback (most recent call last):
File "/usr/local/bin/mkdocs", line 11, in <module>
sys.exit(cli())
File "/Library/Python/2.7/site-packages/click/core.py", line 716, in __call__
return self.main(*args, **kwargs)
File "/Library/Python/2.7/site-packages/click/core.py", line 696, in main
rv = self.invoke(ctx)
File "/Library/Python/2.7/site-packages/click/core.py", line 1060, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Library/Python/2.7/site-packages/click/core.py", line 889, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Library/Python/2.7/site-packages/click/core.py", line 534, in invoke
return callback(*args, **kwargs)
File "/Library/Python/2.7/site-packages/mkdocs/__main__.py", line 137, in build_command
), clean_site_dir=clean)
File "/Library/Python/2.7/site-packages/mkdocs/commands/build.py", line 289, in build
build_pages(config)
File "/Library/Python/2.7/site-packages/mkdocs/commands/build.py", line 249, in build_pages
dump_json)
File "/Library/Python/2.7/site-packages/mkdocs/commands/build.py", line 169, in _build_page
site_navigation=site_navigation
File "/Library/Python/2.7/site-packages/mkdocs/commands/build.py", line 35, in convert_markdown
extension_configs=config['mdx_configs']
File "/Library/Python/2.7/site-packages/mkdocs/utils/__init__.py", line 337, in convert_markdown
extension_configs=extension_configs or {}
File "/Library/Python/2.7/site-packages/markdown/__init__.py", line 159, in __init__
configs=kwargs.get('extension_configs', {}))
File "/Library/Python/2.7/site-packages/markdown/__init__.py", line 185, in registerExtensions
ext = self.build_extension(ext, configs.get(ext, {}))
File "/Library/Python/2.7/site-packages/markdown/__init__.py", line 264, in build_extension
module = importlib.import_module(module_name_old_style)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: Failed loading extension 'mdx_math' from 'mdx_math', 'markdown.extensions.mdx_math' or 'mdx_mdx_math'
安装一下缺的库就可以了:
sudo pip install python-markdown-math
0xFF 总结
MkDocs非常适合不关心页面的程序员写文档了,主题也比较多,展示效果还是不错的。