在GitHub上发布一个Python项目需要注意哪些

时间:2022-07-25
本文章向大家介绍在GitHub上发布一个Python项目需要注意哪些,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本篇介绍个人或企业在 GitHub 上发布一个 Python 项目需要了解和注意哪些内容

  1. 如何配置setup.py
  2. 如何发布到PyPI
  3. 生成pydoc
  4. 版本号的选择
  5. License的选择

配置setup.py

打包和发布一项都是通过准备一个 setup.py 文件来完成的。假设你的项目目录结构如下:

demo
├── LICENSE
├── README.md
├── MANIFEST.in # 打包时,用来定制化生成 `dist/*.tar.gz` 里的内容
├── demo
│   └── __init__.py
├── setup.py
├── tests
│   └── __init__.py
│   └── __pycache__/
└── docs

使用打包命令 python setup.py sdist bdist_wheel将会生成在 dist 目录下生成两个文件 demo-1.0.0-py3-none-any.whldemo-1.0.0.tar.gz

  • .whl 文件是用于执行 pip install dist/demo-1.0.0-py3-none-any.whl 将其安装到 ...Python38Libsite-packagesdemo 目录时使用的文件。
  • .tar.gz 是打包后的源代码的存档文件。而 MANIFEST.in 则是用来控制这个文件里到底要有哪些内容。

下面例子是如何使用 MANIFEST.in 来定制化生成 dist/*.tar.gz 里的内容。MANIFEST.in 文件内容如下:

include LICENSE
include README.md
include MANIFEST.in
graft demo
graft tests
graft docs
global-exclude __pycache__
global-exclude *.log
global-exclude *.pyc

根据以上文件内容,在使用命令 python setup.py sdist bdist_wheel 生成 demo-1.0.0.tar.gz 文件时会包含 LICENSE, README.md, MANIFEST.in 这三个文件,并且还会包含 demo, tests, docs 三个目录下的所有文件,最后排除掉所有的 __pycache__, *.log, *.pyc 文件。

更多关于 MANIFEST.in 文件的语法请参看 https://packaging.python.org/guides/using-manifest-in/

1. 官方有详细的示例和文档 https://packaging.python.org/tutorials/packaging-projects/ 2. Python sample 项目供你参考 https://github.com/pypa/sampleproject

攒点耐心将上面的链接看完,就完全满足一般项目的发布要求了。

发布到PyPI

使用 Python 大家都知道可以通过以下命令来下载你要是使用的外部库,Python 有着大量的第三方库,将开源项目发布到 PyPI 上方便用户使用。

pip install xxxx

什么是 PyPI

PyPI 是 The Python Package Index 的缩写,意思是 Python 包索引仓库,用来查找、安装和发布 Python 包。

PyPI 有两个环境

  • 测试环境 TestPyPI https://test.pypi.org/
  • 正式环境 PyPI https://pypi.org/

准备

  1. 如果想熟悉 PyPI 发布工具和发布流程可以使用测试环境 TestPyPI
  2. 如果已经熟悉了 PyPI 的发布工具和流程可以直接使用正式环境 PyPI
  3. TestPyPI 和 PyPI 需要单独注册,即在正式环境注册了,如果去使用测试环境也同样需要注册。注意:同一个账号不能在 PyPI 和 TestPyPI 同时注册

假设你的项目已经完成了,准备要发布到 PyPI 了,执行下面的命令,就可以将项目发布到 PyPI 上了。

rm dist/*
# 生成代码存档 .tar.gz 文件和构建文件 .whl 文件
python setup.py sdist bdist_wheel
# 如果发布到TestPyPI使用以下命令
twine upload --repository testpypi dist/*
# 如果发布到PyPI使用以下命令
twine upload dist/*

关于pydoc

Python 内置了 doc 的功能,叫 pydoc。执行 python -m pydoc 可以看到它有哪些选项和功能。

cd docs
python -m pydoc -w ..   # 生成全部文档

执行 python -m pydoc -b 可以在本地立即启动一个 web 页面来访问你 ...Python38Libsite-packages 目录下所有 Libraries 文档。

以 elasticsearch 文档为例

这些本地的 web 文档如何在外网进行访问呢?可以通过 GitHub 有内置的 GitHub Pages 功能,很容易提供一个在线网址。

打开你的 GitHub python 项目设置选项 -> 找到 GitHub Pages -> Source 选择你的分支和路径,保存后就立刻拥有了一个网址。例如:

  • https://xxxxx.github.io/demo/ 是你的项目主页,显示 README.md 内容
  • https://xxxxx.github.io/demo/docs/demo.html 是你的项目的 pydoc 文档

关于版本号

另外如果是正式版本,在发布还需要注意版本号的选择。

  • 如果功能简单,完成度也不高,建议从 0.0.1 版本开始
  • 如果功能完善,且完成度很高,那么可以从 1.0.0 版本开始

比如一个项目从准备发布到正式发布有四个阶段:Alpha, Beta, 候选发布以及正式发布。假如正式发布的版本号是 1.1.0 版本,根据以下的版本标识的规范:

X.YaN   # Alpha release
X.YbN   # Beta release
X.YrcN  # Release Candidate
X.Y     # Final release

得到 Alpha, Beta, 候选发布及正式发布版本分别如下:

Alpha release 版本号是 1.1.0a1, 1.1.0a1, 1.1.0aN... Beta release 版本号是 1.1.0b1, 1.1.0b1, 1.1.0bN... Release Candidate 版本号是 1.1.0rc1, 1.1.0rc2, 1.1.0rcN... Final release 版本号 1.1.0, 1.1.1, 1.1.N...

Python 官方的版本标识和依赖规范文档 https://www.python.org/dev/peps/pep-0440

选择License

企业级的项目 License 一般由公司的法律团队来提供,发布者只需拿到 License 文件做一些格式化工作(比如将 license.txt 文件格式化为每行 70~80 个字符)。

如果是个人项目或是想了解开源许可相关的介绍,常见的软件开源许可证(以下许可证是按条件数量排序的)

  • GNU AGPLv3
  • GNU GPLv3
  • GNU LGPLv3
  • Mozilla Public License 2.0
  • Apache License 2.0
  • MIT License
  • Boost Software License 1.0
  • The Unlicense

这里有一篇关于《Github仓库如何选择开源许可证》文章供参考。

1. 如何选项 License https://choosealicense.com/licenses 2. 如何选项 License GitHub 仓库 https://github.com/github/choosealicense.com 3. 如何选项 License 附录 https://choosealicense.com/appendix