自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

2021 年發(fā)布 Python 軟件包的正確姿勢

開發(fā) 后端
如果您像我一樣,偶爾編寫一個(gè)有用的python實(shí)用小程序,并希望與您的同事共享。做到這一點(diǎn)的最好方法是制作一個(gè)Python軟件包:它易于安裝,并且可以避免進(jìn)行拷貝操作。

 [[394524]]

本文轉(zhuǎn)載自微信公眾號「Python中文社區(qū)」,作者Anton  。轉(zhuǎn)載本文請聯(lián)系Python中文社區(qū)公眾號。  

如果您像我一樣,偶爾編寫一個(gè)有用的python實(shí)用小程序,并希望與您的同事共享。做到這一點(diǎn)的最好方法是制作一個(gè)Python軟件包:它易于安裝,并且可以避免進(jìn)行拷貝操作。

您可能會(huì)認(rèn)為創(chuàng)建軟件包很麻煩。其實(shí)現(xiàn)在已經(jīng)不會(huì)這樣了。我將通過此分步指南進(jìn)行說明。只需執(zhí)行三個(gè)主要步驟(以及一系列可選步驟),并輔以幾個(gè)GitHub鏈接即可。

1.初始化

我們將創(chuàng)建podsearch - 一種在iTunes中搜索播客的實(shí)用程序。讓我們創(chuàng)建一個(gè)目錄和一個(gè)虛擬環(huán)境:

  1. $ mkdir podsearch 
  2. $ cd podsearch 
  3. $ python3 -m venv env 
  4. $ . env/bin/activate 

定義一個(gè)最小的包結(jié)構(gòu):

  1. ├── .gitignore 
  2. └── podsearch 
  3.     └── __init__.py 
  4. """Let's find some podcasts!""" 
  5.  
  6.  __version__ = "0.1.0" 
  7.  
  8.  
  9.  def search(namecount=5): 
  10.      """Search podcast by name.""" 
  11.      raise NotImplementedError() 

2.測試包

用Python創(chuàng)建一個(gè)包曾經(jīng)是一個(gè)麻煩的任務(wù)。幸運(yùn)的是,如今有一個(gè)很棒的 flit (https://flit.readthedocs.io/en/latest/)小程序可以簡化所有操作。讓我們安裝它:

  1. pip install flit 

并創(chuàng)建軟件包描述:

  1. $ flit init 
  2. Module name [podsearch]: 
  3. Author [Anton Zhiyanov]: 
  4. Author email [m@antonz.org]: 
  5. Home page [https://github.com/nalgeon/podsearch-py]: 
  6. Choose a license (see http://choosealicense.com/ for more info) 
  7. 1. MIT - simple and permissive 
  8. 2. Apache - explicitly grants patent rights 
  9. 3. GPL - ensures that code based on this is shared with the same terms 
  10. 4. Skip - choose a license later 
  11. Enter 1-4 [1]: 1 
  12.  
  13. Written pyproject.toml; edit that file to add optional extra info. 

pyproject.toml

Flit已創(chuàng)建pyproject.toml - 項(xiàng)目元數(shù)據(jù)文件。它已經(jīng)具有將程序包發(fā)布到公共存儲(chǔ)庫-PyPI所需的一切。

注冊TestPyPi(測試存儲(chǔ)庫)和PyPI(主要存儲(chǔ)庫)。它們是完全獨(dú)立的,因此您將需要兩個(gè)帳戶。

在~/ .pypirc中設(shè)置對存儲(chǔ)庫的訪問權(quán)限:

  1. [distutils] 
  2. index-servers = 
  3.   pypi 
  4.   pypitest 
  5.  
  6. [pypi] 
  7. username: nalgeon  # replace with your PyPI username 
  8.  
  9. [pypitest] 
  10. repository: https://test.pypi.org/legacy/ 
  11. username: nalgeon  # replace with your TestPyPI username 

并將軟件包發(fā)布到測試存儲(chǔ)庫:

  1. $ flit publish --repository pypitest 
  2. Found 4 files tracked in git 
  3. ... 
  4. Package is at https://test.pypi.org/project/podsearch/ 

完畢!該軟件包可在TestPyPi上獲得。

3.公開軟件包

讓我們改進(jìn)代碼,以便它能夠?qū)嶋H搜索播客:

  1. # ... 
  2.  
  3. SEARCH_URL = "https://itunes.apple.com/search" 
  4.  
  5. @dataclass 
  6. class Podcast: 
  7.     """Podcast metadata.""" 
  8.  
  9.     id: str 
  10.     name: str 
  11.     author: str 
  12.     url: str 
  13.     feed: Optional[str] = None 
  14.     category: Optional[str] = None 
  15.     image: Optional[str] = None 
  16.  
  17.  
  18. def search(name: str, limit: int = 5) -> List[Podcast]: 
  19.     """Search podcast by name.""" 
  20.     params = {"term"name"limit": limit, "media""podcast"
  21.     response = _get(url=SEARCH_URL, params=params) 
  22.     return _parse(response) 

并發(fā)布到主存儲(chǔ)庫-PyPI。僅在您的程序包中包含有用的代碼后,才執(zhí)行此步驟。不要發(fā)布無效的程序包和存根。

  1. flit publish 

發(fā)布完畢!是時(shí)候與同事分享了。為了使軟件包易于使用,我建議您再執(zhí)行以下幾個(gè)步驟。

A.自述文件Readme和變更日志changelog

沒人喜歡寫文檔。但是,如果沒有文檔,人們不太可能會(huì)想要安裝您的軟件包,因此我們需要添加README.md和CHANGELOG.md。

  • README.md
  • CHANGELOG.md

將README添加到pyproject.toml,以便PyPI在軟件包頁面上顯示它:

  1. description-file = "README.md" 

還要指定受支持的最低Python版本:

  1. requires-python = ">=3.7" 

更新__init__.py中的版本,并通過flit publish發(fā)布軟件包:

B.Linters和tests

我們來考慮一下格式設(shè)置(black),測試覆蓋率(coverage),代碼質(zhì)量(flake8,pylint,mccabe)和靜態(tài)分析(mypy)。我們將通過tox處理一切。

  1. $ pip install black coverage flake8 mccabe mypy pylint pytest tox 

在tox.ini中創(chuàng)建tox配置:

  1. [tox] 
  2. isolated_build = True 
  3. envlist = py37,py38,py39 
  4.  
  5. [testenv] 
  6. deps = 
  7.     black 
  8.     coverage 
  9.     flake8 
  10.     mccabe 
  11.     mypy 
  12.     pylint 
  13.     pytest 
  14. commands = 
  15.     black podsearch 
  16.     flake8 podsearch 
  17.     pylint podsearch 
  18.     mypy podsearch 
  19.     coverage erase 
  20.     coverage run --include=podsearch/* -m pytest -ra 
  21.     coverage report -m 

tox.ini

并運(yùn)行所有檢查:

  1. $ tox -e py39 
  2. ... 
  3. py39 run-test: commands[0] | black podsearch 
  4. All done!  
  5. ... 
  6. py39 run-test: commands[2] | pylint podsearch 
  7. Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) 
  8. ... 
  9. py39 run-test: commands[6] | coverage report -m 
  10. TOTAL 100% 
  11. ... 
  12. py39: commands succeeded 
  13. congratulations :) 

linters檢測通過,測試也通過了,覆蓋率是100%。

C.云構(gòu)建

每個(gè)可靠的開源項(xiàng)目在每次提交后都會(huì)進(jìn)行云測試,因此我們也將這樣做。一個(gè)很好的附加效果是自述文件中有漂亮的徽章。

讓我們使用GitHub Actions構(gòu)建項(xiàng)目,使用Codecov檢查測試覆蓋率,并使用Code Climate檢查代碼質(zhì)量。

您將必須注冊Codecov和Code Climate(均支持GitHub登錄)并在設(shè)置中啟用軟件包存儲(chǔ)庫。

之后,將GitHub Actions構(gòu)建配置添加到.github / workflows / build.yml:

  1. # ... 
  2. jobs: 
  3.     build: 
  4.         runs-on: ubuntu-latest 
  5.         strategy: 
  6.             matrix: 
  7.                 python-version: [3.7, 3.8, 3.9] 
  8.  
  9.         env: 
  10.             USING_COVERAGE: "3.9" 
  11.  
  12.         steps: 
  13.             - name: Checkout sources 
  14.               uses: actions/checkout@v2 
  15.  
  16.             - nameSet up Python 
  17.               uses: actions/setup-python@v2 
  18.               with
  19.                   python-version: $ 
  20.  
  21.             - name: Install dependencies 
  22.               run: | 
  23.                   python -m pip install --upgrade pip 
  24.                   python -m pip install black coverage flake8 flit mccabe mypy pylint pytest tox tox-gh-actions 
  25.  
  26.             - name: Run tox 
  27.               run: | 
  28.                   python -m tox 
  29.  
  30.             - name: Upload coverage to Codecov 
  31.               uses: codecov/codecov-action@v1 
  32.               if: contains(env.USING_COVERAGE, matrix.python-version) 
  33.               with
  34.                   fail_ci_if_error: true 

build.yml

就像我們前面一樣,GitHub通過tox進(jìn)行測試。tox-gh-actions軟件包和USING_COVERAGE設(shè)置可確保tox使用與strategy.matrix所需的 GitHub Actions 相同的 Python 版本。

最后一步將測試覆蓋率發(fā)送給Codecov。Code Climate不需要單獨(dú)的步驟-它會(huì)自動(dòng)發(fā)現(xiàn)存儲(chǔ)庫更改。

現(xiàn)在,一分鐘內(nèi)提交,推送并享受結(jié)果。并且讓每個(gè)人也喜歡向README.md添加徽章:

  1. [![PyPI Version][pypi-image]][pypi-url] 
  2. [![Build Status][build-image]][build-url] 
  3. [![Code Coverage][coverage-image]][coverage-url] 
  4. [![Code Quality][quality-image]][quality-url] 
  5.  
  6. ... 
  7.  
  8. <!-- Badges --> 
  9.  
  10. [pypi-image]: https://img.shields.io/pypi/v/podsearch 
  11. [pypi-url]: https://pypi.org/project/podsearch/ 
  12. [build-image]: https://github.com/nalgeon/podsearch-py/actions/workflows/build.yml/badge.svg 
  13. [build-url]: https://github.com/nalgeon/podsearch-py/actions/workflows/build.yml 
  14. [coverage-image]: https://codecov.io/gh/nalgeon/podsearch-py/branch/main/graph/badge.svg 
  15. [coverage-url]: https://codecov.io/gh/nalgeon/podsearch-py 
  16. [quality-image]: https://api.codeclimate.com/v1/badges/3130fa0ba3b7993fbf0a/maintainability 
  17. [quality-url]: https://codeclimate.com/github/nalgeon/podsearch-py 

是不是很酷?

D.任務(wù)自動(dòng)化

tox很好,但對于開發(fā)來說不是很方便。運(yùn)行單個(gè)命令(例如pylint,coverage等)的速度更快。但是它們非常冗長,因此我們將一些無意義的操作進(jìn)行自動(dòng)化處理。

讓我們?yōu)镸akefile的頻繁操作創(chuàng)建簡短的別名:

  1. .DEFAULT_GOAL := help 
  2. .PHONY: coverage deps help lint push test 
  3.  
  4. coverage:  ## Run tests with coverage 
  5.  coverage erase 
  6.  coverage run --include=podsearch/* -m pytest -ra 
  7.  coverage report -m 
  8.  
  9. deps:  ## Install dependencies 
  10.  pip install black coverage flake8 mccabe mypy pylint pytest tox 
  11.  
  12. lint:  ## Lint and static-check 
  13.  flake8 podsearch 
  14.  pylint podsearch 
  15.  mypy podsearch 
  16.  
  17. push:  ## Push code with tags 
  18.  git push && git push --tags 
  19.  
  20. test:  ## Run tests 
  21.  pytest -ra 

Makefile

這是我們的任務(wù):

  1. $ make help 
  2. Usage: make [task] 
  3.  
  4. task                 help 
  5. ------               ---- 
  6. coverage             Run tests with coverage 
  7. deps                 Install dependencies 
  8. lint                 Lint and static-check 
  9. push                 Push code with tags 
  10. test                 Run tests 
  11. help                 Show help message 

為了使代碼更簡潔,請使用make調(diào)用替換原始的build.yml步驟:

  1. name: Install dependencies 
  2.   run: | 
  3.       make deps 
  4.  
  5. name: Run tox 
  6.   run: | 
  7.       make tox 

E.云發(fā)布

GitHub有能力為我們運(yùn)行flit publish。讓我們創(chuàng)建一個(gè)單獨(dú)的工作流程:

  1. name: publish 
  2.  
  3. on
  4.     release: 
  5.         types: [created] 
  6.  
  7. jobs: 
  8.     publish: 
  9.         runs-on: ubuntu-latest 
  10.         steps: 
  11.             - name: Checkout sources 
  12.               uses: actions/checkout@v2 
  13.  
  14.             - nameSet up Python 
  15.               uses: actions/setup-python@v2 
  16.               with
  17.                   python-version: "3.9" 
  18.  
  19.             - name: Install dependencies 
  20.               run: | 
  21.                   make deps 
  22.  
  23.             - name: Publish to PyPi 
  24.               env: 
  25.                   FLIT_USERNAME: ${{ secrets.PYPI_USERNAME }} 
  26.                   FLIT_PASSWORD: ${{ secrets.PYPI_PASSWORD }} 
  27.               run: | 
  28.                   make publish 

publish.yml

在存儲(chǔ)庫設(shè)置(Settings > Secrets > New repository secret)中設(shè)置了PYPI_USERNAME和PYPI_PASSWORD。使用您的PyPi用戶名和密碼,甚至更好的-API令牌。

現(xiàn)在,一旦創(chuàng)建新版本,GitHub將自動(dòng)發(fā)布該軟件包。

您的軟件包已準(zhǔn)備就緒!它具有人們夢寐以求的一切:干凈的代碼,清晰的文檔,測試和云構(gòu)建。是時(shí)候告訴你的同事和朋友了。

這些設(shè)置將使您的 Python 軟件包變得AWESOME:

  • pyproject.toml
  • tox.ini
  • Makefile
  • build.yml
  • publish.yml 

 

責(zé)任編輯:武曉燕 來源: Python中文社區(qū)
相關(guān)推薦

2024-01-26 12:35:25

JavaScript項(xiàng)目軟件包

2022-11-07 16:53:53

PipPython軟件包

2019-11-26 17:29:15

Adobe

2016-02-16 13:21:33

2018-06-22 10:05:04

Arch LinuxDEB軟件包

2017-08-21 11:13:43

LinuxSnapcraft Snap軟件包

2010-02-05 14:46:20

Ubuntu軟件包

2017-02-23 15:37:44

OptionObject容器

2016-05-09 10:41:03

算法分析開發(fā)

2017-09-14 14:30:47

LinuxSublime Tex編輯器

2020-02-24 15:26:40

Python短信免費(fèi)

2018-01-11 15:31:39

命令Linux關(guān)機(jī)

2023-01-06 08:24:00

PandasPython

2019-09-25 09:20:33

機(jī)器學(xué)習(xí)Python數(shù)據(jù)科學(xué)

2010-01-07 17:32:09

2011-04-30 16:56:45

Windows PhoiOS

2009-12-16 10:25:14

sage開源軟件包

2010-03-01 17:43:55

Linux Xsupp

2021-10-03 14:30:17

Arch LinuxPKGBUILD 文件軟件包

2010-04-30 10:28:11

Unix安裝
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號