如何開(kāi)源你的Python庫(kù)
這 12 個(gè)步驟能確保成功發(fā)布。
你寫(xiě)了一個(gè) Python 庫(kù)。自己覺(jué)著這太棒了!如果讓人們能夠輕松使用它不是很優(yōu)雅么?這有一個(gè)需要考慮的清單,以及在開(kāi)源 Python 庫(kù)時(shí)要采取的具體步驟。
1、源碼
將代碼放在 GitHub 上,這里有很多開(kāi)源項(xiàng)目,并且人們很容易提交拉取請(qǐng)求。
2、許可證
選擇一個(gè)開(kāi)源許可證。一般來(lái)說(shuō) MIT 許可證是一個(gè)挺好的寬容許可證。如果你有特定要求,Creative Common 的選擇許可證可以指導(dǎo)你完成其它選擇。最重要的是,在選擇許可證時(shí)要記住三條規(guī)則:
- 不要?jiǎng)?chuàng)建自己的許可證。
- 不要?jiǎng)?chuàng)建自己的許可證。
- 不要?jiǎng)?chuàng)建自己的許可證。
3、README
將一個(gè)名為 README.rst
的文件(使用 ReStructured Text 格式化)放在項(xiàng)目樹(shù)的頂層。
GitHub 將像 Markdown 一樣渲染 ReStructured Text,而 ReST 在 Python 的文檔生態(tài)系統(tǒng)中的表現(xiàn)更好。
4、測(cè)試
寫(xiě)測(cè)試。這對(duì)你來(lái)說(shuō)沒(méi)有用處。但對(duì)于想要編寫(xiě)避免破壞相關(guān)功能的補(bǔ)丁的人來(lái)說(shuō),它非常有用。
測(cè)試可幫助協(xié)作者進(jìn)行協(xié)作。
通常情況下,如果可以用 pytest 運(yùn)行就***了。還有其他測(cè)試工具 —— 但很少有理由去使用它們。
5、樣式
使用 linter 制定樣式:PyLint、Flake8 或者帶上 --check
的 Black 。除非你使用 Black,否則請(qǐng)確保在一個(gè)文件中指定配置選項(xiàng),并簽入到版本控制系統(tǒng)中。
6、API 文檔
使用 docstrings 來(lái)記錄模塊、函數(shù)、類(lèi)和方法。
你可以使用幾種樣式。我更喜歡 Google 風(fēng)格的 docstrings,但 ReST docstrings 也是一種選擇。
Sphinx 可以同時(shí)處理 Google 風(fēng)格和 ReST 的 docstrings,以將零散的文檔集成為 API 文檔。
7、零散文檔
使用 Sphinx。(閱讀我們這篇文章。)教程很有用,但同樣重要的是要指明這是什么、它有什么好處、它有什么壞處、以及任何特殊的考慮因素。
8、構(gòu)建
使用 tox 或 nox 自動(dòng)運(yùn)行測(cè)試和 linter,并構(gòu)建文檔。這些工具支持“依賴(lài)矩陣”。這些矩陣往往會(huì)快速增長(zhǎng),但你可以嘗試針對(duì)合理的樣本進(jìn)行測(cè)試,例如 Python 版本、依賴(lài)項(xiàng)版本以及可能安裝的可選依賴(lài)項(xiàng)。
9、打包
使用 setuptools 工具。寫(xiě)一個(gè) setup.py
和一個(gè) setup.cfg
。如果同時(shí)支持 Python 2 和 3,請(qǐng)?jiān)?setup.cfg
中指定 universal 格式的 wheel。
tox 或 nox 應(yīng)該做的一件事是構(gòu)建 wheel 并對(duì)已安裝的 wheel 進(jìn)行測(cè)試。
避免使用 C 擴(kuò)展。如果出于性能或綁定的原因一定需要它們,請(qǐng)將它們放在單獨(dú)的包中。正確打包 C 擴(kuò)展可以寫(xiě)一篇新的文章。這里有很多問(wèn)題!
10、持續(xù)集成
使用公共持續(xù)工具。TravisCI 和 CircleCI 為開(kāi)源項(xiàng)目提供免費(fèi)套餐。將 GitHub 或其他倉(cāng)庫(kù)配置為在合并拉請(qǐng)求之前需要先通過(guò)檢查,那么你就不必?fù)?dān)心在代碼評(píng)審中告知用戶(hù)修復(fù)測(cè)試或樣式。
11、版本
使用 SemVer 或 CalVer。有許多工具可以幫助你管理版本:incremental、bumpversion 和 setuptools_scm 等都是 PyPI 上的包,都可以幫助你管理版本。
12、發(fā)布
通過(guò)運(yùn)行 tox 或 nox 并使用 twine 將文件上傳到 PyPI 上發(fā)布。你可以通過(guò)在 DevPI 中“測(cè)試上傳”。