使用场景

写文档的工具有很多,静态文档也有很多站点工具软件,像Hexo、Hugo、Jekyll等生态也挺好的,今天我想介绍的是一款Python模块里面的Sphinx-Doc文档,我主要用它的目的是根据Markdown文档生成站点,并且可以生成静态Html文件,也能本地浏览。我相信其他产品也能做到,但是没仔细研究,它的一个功能比较吸引我,是生成的文档有带导航栏的目录,主题模板也算丰富,够用。

主要是我要把我的文档提供给无法上网的人离线用,其实就是离线的使用手册一类的需求。

安装Sphinx

我是用Python3来安装和使用的,也可以参考官方安装(反正我用Mac装了命令无法使用)。

请额外建一个目录来开始安装和存放你的文档,然后在用Python虚拟机的方式来安装并使用。

打开一个命令行终端, cd 放到您刚刚创建的目录中,然后运行以下命令:

$ python -m venv .venv
$ source .venv/bin/activate
(.venv) $ python -m pip install sphinx

备注

上面使用的安装方法更详细地描述在 从PYPI安装 。在本教程的其余部分中,这些说明将假定为一个Python虚拟环境。

如果正确执行了这些指令,您应该可以使用Sphinx命令行工具。您可以运行以下命令执行基本验证:

(.venv) $ sphinx-build --version
sphinx-build 4.0.2

如果您看到类似的输出,那么就是安装成功了!

然后从命令行运行以下命令:

(.venv) $ sphinx-quickstart docs

这将在指定路径下创建项目的基本目录和配置布局所需的一系列 docs 文件夹。要继续,请按如下方式回答每个问题:

  • > Separate source and build directories (y/n) [n] :写下“y”(不带引号),然后按 Enter 。
  • > Project name :写下“Lumache”(不带引号),然后按 Enter 。
  • > Author name(s) :写下“Graziella”(不带引号),然后按 Enter 。
  • > Project release [] :写下“0.1”(不带引号)并按 Enter 。
  • > Project language [en] :保留为空(默认为英语,中文输入:zh_CN),然后按键 Enter 。

在最后一个问题之后,您将看到新的 docs 目录中包含以下内容。

docs
├── build
├── make.bat
├── Makefile
└── source
   ├── conf.py
   ├── index.rst
   ├── _static
   └── _templates

这些文件中的每个文件的目的是:

  • build/
    一个空目录(目前),它将保存呈现的文档。
  • make.bat and Makefile
    方便的脚本可以简化一些常见的Sphinx操作,比如呈现内容。
  • source/conf.py
    保存Sphinx项目配置的一个Python脚本。它包含您为指定的项目名称和版本 sphinx-quickstart ,以及一些额外的配置密钥。
  • source/index.rst
    这个 root document作为欢迎页面,并包含“目录树”的根(或 toctree )。

多亏了这个自举步骤,您已经具备了第一次将文档呈现为HTML所需的一切。为此,请运行以下命令:

(.venv) $ sphinx-build -M html docs/source/ docs/build/

最后,打开 docs/build/html/index.html 在您的浏览器中。您应该会看到类似这样的内容:

lumache-first-light

安装插件

如果是默认的情况是不支持md格式文件的,需要装插件。如果有喜欢的主题也可以进行安装,下面我把这个过程演示一遍。

主题地址(大家自行去选择合适自己的主题):https://sphinx-themes.org/

支持markdown文件

pyhton3 pip install recommonmark

安装sphinx_rtd_theme主题

pyhton3 pip install furo

安装sphinx_markdown_tables表格支持

pyhton3 pip install sphinx_markdown_tables

修改文件夹下的conf.py文件,指明要使用的插件和主题,打包会用到,否则是不生效的

# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html

# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information

project = 'XXXX'
copyright = '2024, cookie.joo'
author = 'cookie.joo'
release = ''

# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

# 插件
extensions = ['recommonmark','sphinx_markdown_tables']
# 主题
html_theme = 'furo'

templates_path = ['_templates']
exclude_patterns = []

language = 'en'

# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output

html_static_path = ['_static']

把写好的md文档放到source文件夹下,Sphinx会识别到,并修改index.rst文件,该文件是首页定义文件。

.. FTD部署文档 documentation master file, created by
   sphinx-quickstart on Tue Jun  4 16:00:05 2024.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Welcome to FTD快速部署 documentation!
=======================================

.. toctree::
   :maxdepth: 2
   :caption: Contents:
   
###这里把你的md文档定义到这里,打包会扫描到下面定义的文件,如果是带文件夹就这么描述
   test/jdk
   
###不带文件夹就这么描述,可以把.md后缀加上也可以不加后缀
   docker

Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

请运行以下命令:

## 到docs文件夹下
(.venv) $ cd docs
## 使用这个简易命令更方便,其中如果要重新生成完整的html文件就要先清理再生成,否则只会更新修改后的
(.venv) $ make clean
(.venv) $ make html

image-20240605210527413

问题处理

问题1:md文档的代码块格式无法支持或无法识别

正在写入输出……[100%] infra-ftd-ops/log
/Users/cookie.joo/Desktop/test/docs/source/infra-ftd-ops/log.md:: WARNING: Lexing literal_block 'function check_pid() {\n    pidfile="/app/qadmin/filebeat/filebeat.pid"\n    if [ -f $pidfile ];then\n        pid=`cat $pidfile`\n        if [ -n $pid ]; then\n            running=`ps -p $pid|grep -v "PID TTY" |wc -l`\n            return $running\n        fi\n    fi\n    return 0\n}\nfunction start_filebeat() {\n  pidfile="/app/qadmin/filebeat/filebeat.pid"\n  if [ ! -f "/app/qadmin/filebeat/logs" ]; then\n    mkdir /app/qadmin/filebeat/logs -p\n  fi\n  nohup /app/qadmin/filebeat/bin/filebeat -c /app/qadmin/filebeat/etc/filebeat.yml --path.home /app/qadmin/filebeat --path.config /app/qadmin/filebeat/etc --path.data /app/qadmin/filebeat/data --path.logs /app/qadmin/filebeat/logs >> /app/qadmin/filebeat/logs/root.log 2>&1 &\n  echo $! > $pidfile\n  echo "filebeat started..., pid=$!"\n}\nfunction run_daemon() {\n  check_pid\n  running=$?\n  if [ $running -eq 0 ];then\n      start_filebeat\n  fi\n}\npython3 update_filebeat.py\nrun_daemon\n' as "python" resulted in an error at token: '$'. Retrying in relaxed mode.
正在生成索引... genindex 完成
正在写入附加页面... search 完成
正在复制图像文件……[100%] infra-ftd-ops/images/log/image.png
正在导出 English (code: en) 的搜索索引... 完成
正在导出对象清单... 完成
构建成功, 1 条警告。

这个问题就是我指定了代码块是python格式,但是内容格式不正确,就报出来了,反正改对就行。

还有就是md有些格式这个插件无法识别的,把他改成bash或者不设置代码块的格式就好了。

问题2:新增的页面没有加到首页里面的警告,这个告警好像也会影响打包的问题。

正在更新环境:有 0 个新增文件,有 1 个文件已被修改,有 0 个文件已被移除
正在读取源文件……[100%] index
/Users/cookie.joo/Desktop/test/docs/source/index.rst:9: WARNING: 目录树中引用的文档 'test/nginx' 不存在
/Users/cookie.joo/Desktop/test/docs/source/index.rst:9: WARNING: 目录树中引用的文档 'test/service-api' 不存在
/Users/cookie.joo/Desktop/test/docs/source/index.rst:9: WARNING: 目录树中引用的文档 'test/agent' 不存在
正在查找当前已过期的文件……没有找到已过期文件
正在 Pickle 序列化环境... 完成
正在校验一致性... /Users/cookie.joo/Desktop/test/docs/source/test/agent.md: WARNING: 文档没有加入到任何目录树中
/Users/cookie.joo/Desktop/test/docs/source/test/log.md: WARNING: 文档没有加入到任何目录树中
完成
正在准备写入文档... 完成
正在复制资产文件... 正在复制静态文件... 完成
正在复制额外文件... 完成

问题3:引用的图片不存在

/Users/cookie.joo/Desktop/test/.venv/lib/python3.10/site-packages/recommonmark/parser.py:75: UserWarning: Container node skipped: type=document
  warn("Container node skipped: type={0}".format(mdnode.t))

/Users/cookie.joo/Desktop/test/docs/source/test/jenkins.md:: WARNING: 无法读取图像文件:test/images/jenkins/image.png
正在查找当前已过期的文件……没有找到已过期文件
正在 Pickle 序列化环境... 完成
正在校验一致性... 完成

注意📢:一定要把这些异常给消除,否则重新打包异常就不会有任何更新。

最后

打包编译后的代码都在build/html文件夹下,我关注的就是这个,我要打包这个目录给别人离线使用的。

image-20240605211801197

上一篇 下一篇