jekenis父子结构项目打包_全栈之DevOps系列 - 发布 Python 项目 开源/私有 包
DevOps目前并沒有權(quán)威的定義,普遍認(rèn)為,DevOps 強(qiáng)調(diào)的是高效組織團(tuán)隊(duì)之間如何通過自動(dòng)化的工具協(xié)作和溝通來完成軟件的生命周期管理,從而更快、更頻繁地交付更穩(wěn)定的軟件。
作者以 dukepy 系列項(xiàng)目中 dkimageapp 子項(xiàng)目(關(guān)于圖像處理的實(shí)用工具Python依賴庫模塊)的發(fā)布為例,詳細(xì)解釋了發(fā)布的每個(gè)步驟。作者建議與 dkimageapp 項(xiàng)目一樣,在構(gòu)建整個(gè)項(xiàng)目的時(shí)候,使用項(xiàng)目模板來進(jìn)行初始化構(gòu)建,這樣項(xiàng)目結(jié)構(gòu)也比較優(yōu)秀,推薦 cookiecutter-pypackage(快速建立工程模板的Python命令行工具)項(xiàng)目。使用示例:
pip install cookiecuttercookiecutter https://gitee.com/siq/cookiecutter-pypackage.gitdkimageapp 代碼和文檔托管于Gitee:
61Duke/dkimageapp?gitee.com作者在2017-09-27寫的《打包自己寫的python庫(betubedl)并且發(fā)布到pypi上》上有一段對(duì)pypi和pip挺有意思說法,不見得正確,做此記錄:
pip 是一個(gè)現(xiàn)代的,通用的 Python 包管理工具。提供了對(duì)Python 包的查找、下載、安裝、卸載的功能。而PyPI(Python Package Index)是python官方的第三方庫的倉庫,所有人都可以下載第三方庫或上傳自己開發(fā)的庫到PyPI。PyPI推薦使用pip包管理器來下載第三方庫。所以這兩者在我看來,就是父子關(guān)系。PyPI帶領(lǐng)著pip這個(gè)包管理器為python的開源資源庫夜以繼日地忙碌著。注意:本文假設(shè)你已經(jīng)有一個(gè)想要打包和發(fā)布的項(xiàng)目。
第 0 步:獲取項(xiàng)目許可證
在做其他事之前,由于你的項(xiàng)目要開源,因此應(yīng)該有一個(gè)許可證。獲取哪種許可證取決于項(xiàng)目包的使用方式。開源項(xiàng)目中一些常見許可證有 MIT 或 BSD。如果是公司企業(yè)私有項(xiàng)目,最好也有類似的許可證聲明,允許或者不允許使用者就行轉(zhuǎn)載、使用,這樣項(xiàng)目生態(tài)會(huì)更加規(guī)范。當(dāng)然,這個(gè)不是必要的。
cookiecutter-pypackage 項(xiàng)目中提供可以選擇的開源許可證,直接使用就好。
第 1 步:讓你的代碼準(zhǔn)備就緒
要將項(xiàng)目進(jìn)行打包,你需要做一些預(yù)備工作:
- 讓你的項(xiàng)目結(jié)構(gòu)正確就位。通常情況下,項(xiàng)目庫的根目錄包含一個(gè)以項(xiàng)目名稱命名的文件夾,項(xiàng)目的核心代碼應(yīng)該位于此文件夾中。在這個(gè)文件夾之外是運(yùn)行和構(gòu)建包(測試、文檔等)所需的其他代碼。
- 核心文件夾應(yīng)包括一個(gè)(或多個(gè))模塊和一個(gè) __init__.py 文件,該文件包含你希望讓終端用戶訪問的類/函數(shù)。此文件還可以包含包的版本,以便于終端用戶訪問。
- 理想情況下,應(yīng)使用 logging 包來設(shè)置合理的日志記錄系統(tǒng)(而不是用 print 輸出)。
- 理想情況下,應(yīng)將你的核心代碼分配到一個(gè)或多個(gè)類中。
cookiecutter-pypackage 項(xiàng)目中上述項(xiàng)目準(zhǔn)備工作,直接使用就好。
以 dkimageapp 項(xiàng)目為例:
dkimageapp 項(xiàng)目結(jié)構(gòu)示例第 2 步:使用打包工具創(chuàng)建 setup.py
在你的項(xiàng)目有了一套結(jié)構(gòu)之后,你應(yīng)該在項(xiàng)目庫的根目錄下添加 setup.py 文件。這有助于所有發(fā)布和版本維護(hù)過程的自動(dòng)化。以下是 dkimageapp 的 setup.py 的示例:
#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright (c) 61DUke.# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR # PURPOSE. # See the Readme Document for more details. # Create: 2020-12-27"""The setup script."""from setuptools import setup, find_packages import oswith open("README.rst", "r", encoding="utf-8") as readme_file:readme = readme_file.read()with open("HISTORY.rst", "r", encoding="utf-8") as history_file:history = history_file.read()dir_ = os.path.dirname(os.path.abspath(__file__)) requirements = open(os.path.join(dir_, "requirements.txt"), "r", encoding="utf-8").read().splitlines()setup_requirements = ["pytest-runner", ]test_requirements = ["pytest>=3", ]setup(author="61Duke",author_email="loveweihaitong@foxmail.com",python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",classifiers=["Development Status :: 2 - Pre-Alpha","Intended Audience :: Developers","License :: OSI Approved :: MIT License","Natural Language :: English","Programming Language :: Python :: 2","Programming Language :: Python :: 2.7","Programming Language :: Python :: 3","Programming Language :: Python :: 3.5","Programming Language :: Python :: 3.6","Programming Language :: Python :: 3.7",],description="dkimageapp是61Duke于2020年整合工作與學(xué)習(xí)研發(fā)關(guān)于圖像處理的實(shí)用工具Python依賴庫模塊,該模塊統(tǒng)一規(guī)范的API""接口,承載個(gè)人未來工作中開發(fā)有關(guān)圖像處理實(shí)際應(yīng)用。該模塊由算法科學(xué)家61Duke獨(dú)家研發(fā),提供圖像裁剪、合并、圖像格式轉(zhuǎn)換、""色調(diào)占比提取、顏色相似度、圖像定位和圖像檢索等功能。dkimageapp 模塊為各個(gè)項(xiàng)目和業(yè)務(wù)提供支持。",entry_points={"console_scripts": ["dkimageapp=dkimageapp.cli:main",],},install_requires=requirements,license="MIT license",long_description=readme + "nn" + history,include_package_data=True,keywords="dkimageapp",name="dkimageapp",packages=find_packages(include=["dkimageapp", "dkimageapp.*"]),setup_requires=setup_requirements,test_suite="tests",tests_require=test_requirements,url="https://gitee.com/weihaitong/dkimageapp",version="0.1.0",zip_safe=False, )cookiecutter-pypackage 項(xiàng)目中也會(huì)將setup.py生成好,直接使用就好。
注意事項(xiàng):
- 如果你的包有依賴項(xiàng),處理這些依賴項(xiàng)的簡單方法是在配置文件中通過 install_requires 參數(shù)來添加依賴項(xiàng)(如果列表很長,你可以像上面那樣指向一個(gè) requirements.txt 文件)。
- 如果你希望在任何人安裝包時(shí)(從項(xiàng)目庫中)下載元數(shù)據(jù),則應(yīng)通過 package_data 參數(shù)來添加這些元數(shù)據(jù)。
- 有關(guān) setup() 函數(shù)的更多信息,請(qǐng)參見:setuptools 文檔
注意:第 3 步到第 6 步是可選的(但強(qiáng)烈推薦),但是如果你現(xiàn)在馬上想發(fā)布你的包,可以直接跳到第 7 步。
第 3 步:設(shè)置本地測試和檢查測試覆蓋率
此時(shí)還沒有完成,你的項(xiàng)目還應(yīng)該有單元測試。盡管有許多框架能幫助你做到,但一種簡單的方法是使用 pytest。所有測試都應(yīng)該放在一個(gè)專用的文件夾中(例如名為 tests/或 testing 的文件夾)。在這個(gè)文件夾中放置你需要的所有測試文件,以便盡可能多地包含你的核心代碼。
第 4 步:標(biāo)準(zhǔn)化語法和代碼風(fēng)格
你還需要確保你的代碼遵循 PEP8 準(zhǔn)則(即具有標(biāo)準(zhǔn)樣式并且語法正確)。同樣,有很多工具可以幫助你解決。這里我們用了 flake8。
第 5 步:創(chuàng)建一個(gè)合理的文檔
現(xiàn)在你的項(xiàng)目已經(jīng)測試過了,結(jié)構(gòu)也很好了,是時(shí)候添加一個(gè)合理的文檔。首先是要有一個(gè)好的 readme 文件,它會(huì)在你的代碼托管項(xiàng)目庫的根目錄上顯示。
由于 readme 文件應(yīng)該相當(dāng)綜合,因此通常會(huì)有一個(gè)更詳細(xì)的文檔。你可以用 sphinx 來完成,然后在 readthedocs 上管理文檔。與文檔相關(guān)的文件通常放在 docs/文件夾中。sphinx 和 readthedocs 相關(guān)教程。
cookiecutter-pypackage 項(xiàng)目中也會(huì)生成很多標(biāo)準(zhǔn)的項(xiàng)目文檔和作者、貢獻(xiàn)和歷史等文檔,直接使用就好。
以下是 dkimageapp 的 README.rst 的示例:
第 6 步:創(chuàng)建持續(xù)集成
此時(shí),你的項(xiàng)目離發(fā)布就緒不遠(yuǎn)了。但是,在每次提交之后,必須更新文檔、運(yùn)行測試以及檢查樣式和覆蓋率似乎有點(diǎn)難以應(yīng)付。幸運(yùn)的是,持續(xù)集成(CI)可以幫助你完成。你可以在每次提交之后使用 GitHub 的 webhook 來自動(dòng)執(zhí)行所有的這些操作。
第 7 步:創(chuàng)建你的第一個(gè) release 和 publication
構(gòu)建發(fā)布版本的包
在項(xiàng)目根目錄下使用 python setup.py sdist bdist_wheel ,這將在新創(chuàng)建的dist目錄中創(chuàng)建兩個(gè)文件,一個(gè)源歸檔文件和一個(gè)wheel文件。以 dkimageapp 項(xiàng)目為例:
開源:
PyPI:首先需要?jiǎng)?chuàng)建一個(gè)帳戶(注冊(cè)傳送門PyPI),其次在項(xiàng)目根目錄下使用 twine upload dist/* 去上傳并發(fā)布包給開源的PyPI社區(qū)倉庫。
私有(使用pypiserver):
以 dkimageapp 項(xiàng)目為例:
使用密碼保護(hù)PyPI源
當(dāng)希望使用密碼來控制Python包的上傳操作的時(shí)候, 需要使用Apache htpasswd 文件.
pypiserver 需要 passlib 包來讀取 htpasswd 文件. 使用以下命令來安裝 passlib :
pip install passlib要生成 htpasswd 文件, 需要安裝 apache2-utils 工具包. 在Ubuntu上使用以下命令安裝:
apt-get install -y apache2-utils接下來就可以用 htpasswd 命令來生成密碼文件. 假設(shè)密碼文件路徑為 /root/.pypipasswd , 第一次生成密碼文件的命令如下:
htpasswd -c /root/.pypipasswd sam上述命令中的最后一個(gè)參數(shù)sam是用戶名, 執(zhí)行命令后, 會(huì)提示輸入密碼.
當(dāng)需要在已有的密碼文件中添加新的用戶名和密碼時(shí), 不能再使用-c參數(shù), 否則會(huì)將已有的數(shù)據(jù)覆蓋. 比如, 要在上一步生成的文件里添加一個(gè)新用戶名 john :
htpasswd /root/.pypipasswd john接下來就可以使用密碼文件來控制上傳操作了. 當(dāng)啟動(dòng) pypiserver 時(shí), 通過-P參數(shù)來指定所要使用的密碼文件. 默認(rèn)情況下, 上傳操作會(huì)需要密碼驗(yàn)證, 如果希望其他操作也需要密碼驗(yàn)證, 可以使用-a參數(shù). 具體-a參數(shù)的使用可以查閱_pypiserver_的啟動(dòng)命令幫助, 這里不再展開.
pypi-server -P /root/.pypipasswd第 7 步:下載使用發(fā)布的庫
以 dkimageapp 項(xiàng)目為例:
現(xiàn)在,你的包應(yīng)該已經(jīng)發(fā)出去,并且任何人/指定人可以使用了!雖然大部分工作都完成了,但是你仍然需要維護(hù)你的項(xiàng)目,你需要進(jìn)行一些更新:這大體上意味著每次進(jìn)行重大更改時(shí)都要更改版本,創(chuàng)建新的 release,并再次執(zhí)行第 7 步。
本文為2017-09-27的《打包自己寫的python庫(betubedl)并且發(fā)布到pypi上》博客的遷移,并做了全面性擴(kuò)展,日后在此繼續(xù)更新內(nèi)容...
贊助
感謝支持 感謝贊助 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的jekenis父子结构项目打包_全栈之DevOps系列 - 发布 Python 项目 开源/私有 包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rtx3090能组成超级计算机吗,「必看
- 下一篇: 当前计算机领域中 有关计算机的性能指标,