精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用哪些工具,可以提升 Python 項目質量

新聞 前端
代碼質量工具可以都抽離出來,應用到每個項目中, 本文則是我對這些代碼質量工具的簡要使用總結。

 

前記

在編寫項目時,都會對代碼質量有一定的追求, 比如代碼藝術、設計模式、 重構設計等等。但是一個良好 Python 項目除了程序員本身的代碼質量能力之外, 還有系統(tǒng)設計和代碼質量工具等等。不過由于每個系統(tǒng)的設計都會有一些不同, 系統(tǒng)設計需要程序員一定的經驗, 需要跟著項目去一起成長。

代碼質量工具可以都抽離出來,應用到每個項目中, 本文則是我對這些代碼質量工具的簡要使用總結。

0.提交代碼規(guī)范

每個團隊或個人, 都必須要有一套自己的分支管理和提交代碼規(guī)范, 對于分支管理, 一般會選用 git flow , 如果不太會使用, 前期可以使用git flow 備忘清單(https://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html), 并且對于 master ,  develop 等分支設置一些權權限。另外提交的信息也要有對應的規(guī)范, 比如本次提交屬于哪種類型, 本次提交的功能是什么等等, 但是這個提交規(guī)范往往都沒有一個標準, 只要團隊和個人用的順心, 能通過這些規(guī)范來減少開發(fā)矛盾, 復盤代碼等等即可。我常使用的是:

  1. git commit -m"<issue_id>:<file change>:<operating>:<info>" 

其中每個字段代表的含義如下:

  • issue_id: 代表一個issue的id, 在準備寫功能或者修復一個bug時,都應該先提一個issue, 這個issue要詳細的寫明要修改什么,達到什么目的,然后再針對這個issue提交代碼

  • file change: 代表文件的變化, 如增加, 刪除, 修改;也有人使用 +,-,* 來分別代表增加, 刪除, 修改
  • operating: 代表本次代碼變化, 具體有如下幾種

    • feat:新功能

    • fix:修復bug

    • doc:文檔改變

    • style:代碼格式改變

    • refactor:某個已有功能重構

    • perf:性能優(yōu)化

    • test:增加測試

    • build:改變了build工具 如 grunt換成了 npm

    • revert:撤銷上一次的commit

  • info: 簡要的說明本次提交信息

1.項目環(huán)境管理-Poetry

一個項目最重要的就是跑起來, 而大家基本會同時在本地開發(fā)多個項目, 每個項目用到的環(huán)境都是不一樣的, 所以就需要用到虛擬環(huán)境隔離。在Python中提供了一個叫 venv 的虛擬環(huán)境管理包,他非常穩(wěn)定, 同時功能也不是很多, 一般只用在服務器上, 對于本地開發(fā)來說, 都會想要更多的功能, 更加方便的對虛擬環(huán)境, 依賴包進行管理, Python包管理領域相關工具很多, 包括爭議很大的 Pipenv , 我在經過多種嘗試后, 覺得 Poetry 比較好用, 坑也比較少。

Poetry(https://python-poetry.org/)官網的簡介就是讓Python包安裝和依賴管理變得容易,  我覺得 Poetry 是最好用的, 他不止對包管理有很多的支持, 還有其他的拓展功能, 如方便的打包和發(fā)布, 腳本簡寫等等。

在第一次大多數(shù)的Python項目編寫中, 基本上都是按以下流程進行:

  • 1.安裝對應的Python版本

  • 2.通過 python -m venv <name> 的方式在項目創(chuàng)建venv的虛擬環(huán)境
  • 3.在使用的過程中通過 python -m pip install <name> 的方式安裝依賴
  • 4.在代碼編寫完畢后通過 python -m pip freeze > requirements.txt 生成依賴文件

而 Poetry 則十分簡單, 以下是 poetry 的創(chuàng)建流程:

1.1.創(chuàng)建項目

通過命令 poetry new 就可以創(chuàng)建一個項目手腳架

  1. ➜ poetry new example 
  2. ➜ tree 
  3. └── example 
  4.     ├── example 
  5.     │   └── __init__.py 
  6.     ├── pyproject.toml 
  7.     ├── README.rst 
  8.     └── tests 
  9.         ├── __init__.py 
  10.         └── test_example.py 
  11.  
  12. 3 directories, 5 files 

可以看到 Poetry 創(chuàng)建了一個 example 的項目, 生成了對應的文件夾以及包括項目信息的 pyproject.toml 。如果在已有項目, 則通過命令 poetry init 來初始化:

  1. ➜  example poetry init 
  2.  
  3. This command will guide you through creating your pyproject.toml config. 
  4. # 交互bash, 通過該交互bash填寫項目信息。 
  5. Package name [example]:  example 
  6. Version [0.1.0]:  0.0.8 
  7. Description []:  example project 
  8. Author [so1n <qaz6803609@163.com>, n to skip]:  n 
  9. License []:   
  10. Compatible Python versions [^3.7]:   
  11.  
  12. Would you like to define your main dependencies interactively? (yes/no) [yes] no 
  13. Would you like to define your development dependencies interactively? (yes/no) [yes] no 
  14. Generated file 
  15. # 填寫完項目信息后會生成以下內容, 之后會在剛才的路徑創(chuàng)建pyproject.toml文件, 并寫入。  
  16. [tool.poetry] 
  17. name = "example" 
  18. version = "0.0.8" 
  19. description = "example project" 
  20. authors = ["Your Name <you@example.com>"
  21.  
  22. [tool.poetry.dependencies] 
  23. python = "^3.7" 
  24.  
  25. [tool.poetry.dev-dependencies] 
  26.  
  27. [build-system] 
  28. requires = ["poetry-core>=1.0.0"
  29. build-backend = "poetry.core.masonry.api" 
  30.  
  31.  
  32. Do you confirm generation? (yes/no) [yes] yes 

1.2.創(chuàng)建虛擬環(huán)境

Poetry 默認使用系統(tǒng)默認的Python環(huán)境, 不過可以通過 poetry env use <python version> 來指定Python版本, 之后就創(chuàng)建了一個虛擬環(huán)境了。默認的虛擬環(huán)境配置是存放在 /home/{user}/.cache/pypoetry 目錄的, 可以直接查看配置了解:

  1. ➜  poetry config --list 
  2. # poetry使用的緩存目錄的路徑 
  3. cache-dir = "/home/so1n/.cache/pypoetry" 
  4. experimental.new-installer = true 
  5. installer.parallel = true 
  6. # 默認值為true,如果執(zhí)行 poetry install/poetry add時沒有虛擬環(huán)境,就自動創(chuàng)建一個虛擬環(huán)境,設置為false的話,當虛擬環(huán)境不存在時,會將包安裝到系統(tǒng)環(huán)境 
  7. virtualenvs.create = true 
  8. # 默認值為false,設置為true的話,會在當前項目目錄下創(chuàng)建虛擬環(huán)境 
  9. virtualenvs.in-project = false 
  10. # 虛擬環(huán)境的路徑,默認路徑 {cache-dir}\virtualenvs 
  11. virtualenvs.path = "{cache-dir}/virtualenvs"  # /home/so1n/.cache/pypoetry/virtualenvs 

而默認的使用習慣(包括一些第三方包) 都是認為venv是創(chuàng)建在項目路徑下的, 同時這也方便管理。 poetry 可以通過如下命令進行更改后再創(chuàng)建虛擬環(huán)境,達到在項目路徑下創(chuàng)建虛擬環(huán)境的效果:

  1. # 更改配置 
  2. ➜ poetry config virtualenvs.in-project true  

在虛擬環(huán)境創(chuàng)建好后可以通過

  1. ➜ poetry run <commod>  

來執(zhí)行想要運行的命令或者調用Python包, 也可以通過 poetry shell 啟動一個被虛擬環(huán)境包裹的交互shell.

1.3.安裝依賴

虛擬環(huán)境創(chuàng)建好后, 就可以安裝依賴了, 可以直接使用 poetry 的 add 命令安裝依賴, 其中帶有 --dev 表示他是開發(fā)環(huán)境依賴包(開發(fā)環(huán)境依賴包和生成環(huán)境依賴包區(qū)分是很有益的):

  1. ➜ poetry add flask 
  2. ➜ poetry add pytest --dev  

安裝依賴后可以看到 pyproject.toml 文件發(fā)生變動:

  1. ... 
  2. [tool.poetry.dependencies] 
  3. python = "^3.7" 
  4. Flask = "^1.1.2" 
  5.  
  6. [tool.poetry.dev-dependencies] 
  7. pytest = "^6.2.4" 
  8. ... 

文件中多了剛剛安裝的 flask 依賴和 pytest 依賴, 且 pytest 依賴是屬于dev依賴。在后面還可以通過 poetry 的命令生成對應的生產環(huán)境依賴文件 requirement.txt 和測試環(huán)境依賴文件 requirements-dev.txt :

  1. # 生產環(huán)境 
  2. poetry export -o requirements.txt --without-hashes --with-credentials 
  3. # 測試環(huán)境 
  4. poetry export -o requirements-dev.txt --without-hashes --with-credentials --dev 

這樣區(qū)分測試環(huán)境和生產環(huán)境的依賴可以盡量的減少測試需要的依賴包對生成環(huán)境造成影響。

除了增加依賴外, poetry 還支持很多種依賴操作方法, 具體如下:

  1. # 查看依賴 
  2. poetry show 
  3. # 以樹形結構查看依賴 
  4. poetry show -t 
  5. # 更新所有鎖定版本的依賴 
  6. poetry update 
  7. # 更新指定的依賴 
  8. poetry update flask 
  9. # 刪除依賴 
  10. poetry remove flask 

1.4.其他

對于一般的自用Python項目來說, 上面的 poetry 操作已經夠了, 如果需要發(fā)布自己的包到pypi, 或者安裝github最新的并未發(fā)布的包則可以使用他的其他拓展命令, 具體可以見文檔(https://python-poetry.org/docs/)。個人覺得 poetry 已經非常優(yōu)秀了, 但是由于缺少一個穩(wěn)定的維護團隊, 所以難免有bug, 這時候可以采用降級的方法解決, 比如安裝依賴失敗, 則可以使用 poetry run pip install 安裝包, 再手動補上 pyproject.yml 文件。

2.代碼質量工具

在大型的項目中, 一般都不追求花哨的代碼, 而是追求穩(wěn)定, 容易理解, 復雜度低的代碼, 最完美的代碼應該是入行的人一看就能理解, 又能完美的解決需求。但是人無完人, 很多時候在寫代碼可能會出現(xiàn)一些小問題, 而這些小問題靠人來檢查是費時費力的, 同時又很難排查出來,這時就需要代碼檢查工具了。一般代碼檢查工具分為三類, 一類是檢查代碼風格, 并把不標準的代碼風格格式化為標準的代碼風格;另一類則是代碼邏輯檢查,他會檢查代碼邏輯, 代碼復雜度, 引用的包是否有問題等等, 最后一類是代碼安全檢查, 比如是否在代碼中引入密鑰, 或者像在 Python 代碼中寫 eval 函數(shù)等。

2.1.flake8

Flake8 是由Python官方發(fā)布的一款輔助檢測Python代碼是否規(guī)范的工具,相對于目前熱度比較高的 Pylint 來說, Flake8 檢查規(guī)則靈活,支持集成額外插件,擴展性強。 Flake8 是對下面三個工具的封裝:

  • 1.PyFlakes:靜態(tài)檢查Python代碼邏輯錯誤的工具。

  • 2.Pep8:靜態(tài)檢查PEP8編碼風格的工具。

  • 3.NedBatchelder’s McCabe :靜態(tài)分析Python代碼復雜度的工具。

Flake8 除了支持上面3種功能外, 還支持通過插件的方式引入其他功能, 比如使用 flake8-docstrings 強制要求編寫函數(shù) docstring 等。

在項目中可以通過 poetry add flake8 --dev 引入flake8到dev依賴, 然后通過在根目錄增加 .flake8 文件:

  1. [flake8] 
  2. # 適當提高最大行長度 
  3. max-line-length = 120 
  4. # 設置最大復雜度 
  5. max-complexity = 24 
  6. # 忽略這些錯誤類型 
  7. ignore = F401, W503, E203 
  8. # 忽略以下文件 
  9. exclude = 
  10.     .git, 
  11.     .venv, 
  12.     __pycache__, 
  13.     scripts, 
  14.     logs, 
  15.     upload, 
  16.     build, 
  17.     dist, 
  18.     docs, 
  19.     migrations, 

指定 Flke8 該如何執(zhí)行, 最后調用命令 poetry run flake8. 即可。

2.2.mypy

毫無疑問, Python的語法讓人能簡潔的寫出代碼, 但是他的動態(tài)語言特性會使大型項目變得不牢固, 而 mypy 的出現(xiàn)恰好能解決這一問題。 mypy 是一個靜態(tài)類型檢查工具,它可以幫助我們像靜態(tài)語言一樣在運行代碼之前就捕獲到某些錯誤, 但是我們在寫Python代碼時, 要像靜態(tài)語言一樣, 會參數(shù)寫上他的類型, 這就是Type Hints, 通過 mypy 和 Type Hints 的結合, 雖然會增加我們的代碼量,  但它可以引入如下好處:

  • 1.可以使 IDE 通過類型推斷提供更好的代碼補全和提示功能, 方便項目重構以及提前檢查出錯誤。
  • 2.強制你去思考動態(tài)語言程序的類型可能會幫助你構建更清晰的代碼架構。

比如有如下一個函數(shù):

  1. def foo(a, b): 
  2.     return a + b 

一般來說無法知道這個函數(shù)要傳什么類型的參數(shù)進去, 也許一開始是傳 int 變量, 后面變?yōu)?nbsp;str 變量, 而通過 Type Hints 則可以指定這個變量的類型是什么, 以及返回的類型是什么, 經過改造后將會變?yōu)椋?/p>

  1. def foo(a: int, b: int) -> int
  2.     return a + b 

這個函數(shù)的a, b參數(shù)以及返回的值類型都被標注為 int 類型, 這時候假如在程序內有兩個調用:

  1. foo(12
  2. foo("a""b"

他們雖然都能運行, 但是可以通過 mypy 檢查出第二種調用方式是錯誤的。雖然這種示例簡簡單單, 看不出什么痛點, 但是在復雜的邏輯中, 他的優(yōu)勢就非常明顯了。

在項目中可以通過 poetry add mypy --dev 安裝依賴包, 然后通過在根目錄增加 mypy.ini 文件:

  1. # mypy的核心配置 
  2. [mypy] 
  3. # 指明函數(shù)的值類型也要檢查 
  4. disallow_untyped_defs = True 
  5. # 忽略一些import的錯誤, 有些舊包架構可能不符合mypy的要求 
  6. ignore_missing_imports = True 
  7.  
  8. # 指明針對根目錄tests的配置 
  9. [mypy-tests.*] 
  10. # 指明忽略對這個范圍的檢查 
  11. ignore_errors = True 

指定 mypy 該如何執(zhí)行, 最后調用 poetry run mypy . 即可

2.3.自動格式化代碼

Python是一個動態(tài)語言, 而且不會對代碼風格做強要求, 這就會導致一千個人一千種Python代碼風格, 這同樣在大型項目中非常糟糕的...好在Python生態(tài)中有很多自動格式化的工具, 但這里并不會詳細對比他們的差異, 只是簡要介紹下我在試用了多種后保留了以下3個工具(適不適合自己團隊, 還是得自己試試才知道):

  1. Pycharm 
  2. Pycharm 
  3. poetry add autopep8 --dev 
    • --in-place : 直接對文件進行更改, 而不是把差異打印出來(用它就要相信他)
    • --exclude : 排除哪些文件/文件夾不進行格式化
    • --recursive : 遞歸的遍歷文件
    • --remove-all-unused-imports : 刪除所有未導入的依賴包
    • --ignore-init-module-imports : 刪除所有未導入的包時排除 __init__.py 文件
    • --remove-unused-variables :刪除未使用的變量
  • 2.isort, 這個工具主要是用來給import語句進行格式化, 比如語句超出文件允許最大長度自動換行, 以及對import語句進行自動排序(這個功能對強迫癥來說爽飛了)。isort可以通過 poetry add isort --dev 進行安裝, isort支持 pyproject.toml 文件配置, 以下是我的一個常用配置:
  1. [tool.isort] 
  2. # 兼容black模式, 因為使用到了black進行自動格式化 
  3. profile = "black" 
  4. # 當import包過多超過文件長度后需要換行時, 采用哪種模式 
  5. multi_line_output = 3 
  6. include_trailing_comma = true 
  7. force_grid_wrap = 0 
  8. use_parentheses = true 
  9. ensure_newline_before_comments = true 
  10. # 每行的最長長度 
  11. line_length = 120 
  12. # 忽略的文件夾 
  13. skip_glob = "tests" 
  • 3.black, 號稱不妥協(xié)的自動格式化工具, 只要它認為不合適的, 就自動格式化, 沒有選擇的余地, 如果與團隊標準不一樣的請慎用, 我是挺接受他的自動格式化風格的...。black可以通過 poetry add black --dev 進行安裝, mypy同樣支持 pyprojrct.toml 文件配置, 以下是我的一個常用配置(black的配置項不多):
  1. [tool.black] 
  2. # 每行的最長長度 
  3. line-length = 120 
  4. # 當前是哪個Python版本 
  5. target-version = ['py37'

3.pre-commit

自動格式化的工具引入到項目沒多久后就會開始尋求自動化了, 因為每次提交之前都要手動跑一些自動格式化的腳本, 實在是太麻煩了, 好在有 pre-commit 這個專門為 git hooks 而生的工具。

pre-commit 是一個用于管理和維護多種語言的  git pre-commit hooks 框架,就像Python的包管理器  pip 一樣,可以通過  pre-commit 將他人創(chuàng)建并分享的  pre-commit hooks 安裝到自己的項目倉庫中。 pre-commit 的出現(xiàn)大大減少了我們使用  git hooks 的難度,只需要在配置文件中指定想要的  hooks ,它會替你安裝任意語言編寫的  hooks 并解決環(huán)境依賴問題,然后在每次提交前執(zhí)行 hooks 。

3.1.安裝

一般來說, 通過 pip install pre-commit 就可以安裝了, 但是為了環(huán)境隔離, 需要使用  poetry add pre-commit --dev 安裝, 安裝完后就可以在項目根目錄創(chuàng)建文件 .pre-commit-config.yaml , 以下是我的配置, 除了上面提到的幾個工具外, 還有一些其他腳本的校驗工具:

  1. repos: 
  2.   - repo: https://github.com/pre-commit/mirrors-mypy 
  3.     rev: v0.910 
  4.     hooks: 
  5.       - id: mypy 
  6.   - repo: https://github.com/PyCQA/isort 
  7.     rev: 5.9.3 
  8.     hooks: 
  9.       - id: isort 
  10.   - repo: https://github.com/psf/black 
  11.     rev: 21.7b0 
  12.     hooks: 
  13.       - id: black 
  14.   - repo: https://github.com/PyCQA/flake8 
  15.     rev: 3.9.2 
  16.     hooks: 
  17.       - id: flake8 
  18.   - repo: https://github.com/myint/autoflake 
  19.     rev: v1.4 
  20.     hooks: 
  21.       - id: autoflake 
  22.         args: ['--recursive',  '--in-place''--remove-all-unused-imports''--remove-unused-variable'
  23.   - repo: https://github.com/pre-commit/pre-commit-hooks 
  24.     rev: v3.2.0 
  25.     hooks: 
  26.       - id: check-ast 
  27.       - id: check-byte-order-marker 
  28.       - id: check-case-conflict 
  29.       - id: check-docstring-first 
  30.       - id: check-executables-have-shebangs 
  31.       - id: check-json 
  32.       - id: check-yaml 
  33.       - id: debug-statements 
  34.       - id: detect-private-key 
  35.       - id: end-of-file-fixer 
  36.       - id: trailing-whitespace 
  37.       - id: mixed-line-ending 

文件中的內容很簡單, 它指明使用了哪些工具, 工具是哪個版本, 以及使用哪些 hook (一個倉庫可能有多個hook), 每個參數(shù)的解釋如下:

  • repo: 倉庫url, pre-commit通過git來安裝存在于github的工具

  • rev: 每個工具的版本, 這里是利用到git的tag屬性

  • hooks/id: 每個倉庫會有很多個hook, 通過hooks-id來選擇要使用的hooks

  • hook/id/args: 每個hook都支持一些參數(shù), args就是配置hook的參數(shù)

這些工具都會讀取根目錄的配置文件, 而 autoflake 我找不到他的 pyproject.toml 配置說明, 所以直接通過的 args 參數(shù)配置參數(shù)。之后就可以直接調用 hook 腳本, 如果是第一次引入已有項目則應該先手動調用 poetry run pre-commit run --all-files , 他會調用所有 hook 對項目進行檢查, 然后再根據(jù)檢查結果對代碼和配置進行調整。調整完畢之后可以調用 poetry run pre-commit install 把 hook 腳本進行安裝,它會自動安裝在 .git/hooks/pre-commit 。安裝后, 每執(zhí)行次 git commit 時, 都會通過 git hooks 機制自動執(zhí)行腳本, 自動對代碼進行檢查和格式化。

上面的配置文件是我的常用配置, pre-commit 的hook有很多, 不止這些, 如有興趣可以到pre-commit hook合集(https://pre-commit.com/hooks.html)查閱所有hook

4.遠程倉庫自動執(zhí)行

本地的hook只針對本地提交者, 而在團隊協(xié)作中, 其他人員可以暫時屏蔽或者刪除hook文件, 導致本地hook沒辦法達到強制的作用, 所以團隊一般會在Github&Gitlab中的 pre-recevice 階段配置一個自己的腳本, 用來跑上面的代碼檢測工具, 雖然兩種的做法有點不同, 但核心步驟都是一樣:

  • 1.先拉取最新的代碼到容器里

  • 2.安裝階段, 這時候會向容器安裝Python版本以及類似 Redis 容器等等
  • 3.代碼檢查, 這時候會運行代碼質量檢測工具, 如果有一個檢測錯誤, 那么就拒絕提交, 并顯示哪里錯誤了, 如果沒有問題就走下一步。

  • 4.測試階段, 該階段會運行測試用例,檢測測試代碼覆蓋率是否合格, 同樣的, 如果檢測不合格就會拒絕提交, 成功就進入下一步。

  • 4.風格統(tǒng)一, 使用風格統(tǒng)一插件, 如Python中的 isort ,  black 等, 把項目的代碼進行格式化。

一般每個公司都有自己的一套標準 CI/CD , 而他們的使用方法可能都會有些差別, 但核心原理也差不多, 以下會以開源項目為例介紹如何使用Github的action(這個功能是免費的?。。?.

Gitlab的CI/CD相關文章比較多, 可以查閱網絡或查閱書籍《持續(xù)交付》(https://book.douban.com/subject/6862062/), 也可以查看文章:https://www.mindtheproduct.com/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/, 如果對Gitlab hook有興趣可以查閱Gitlab pre-receive webook 的添加與使用(treesir.pub/post/gitlab-pre-receive-webhook)

該例子來自于我的項目rap。首先在項目目錄創(chuàng)建 script 目錄, 這里面的目錄可以被本地調用, 但主要還是用于 Github action , 首先創(chuàng)建一個install的腳本, 這個腳本用于安裝依賴包:

  1. #!/bin/sh -e 
  2.  
  3. # Use the Python executable provided from the `-p` option, or a default
  4. "$1" = "-p" ] && PYTHON=$2 || PYTHON="python3" 
  5.  
  6. REQUIREMENTS="requirements-dev.txt" 
  7. VENV="venv" 
  8.  
  9. set -x 
  10.  
  11. if [ -z "$GITHUB_ACTIONS" ]; then 
  12.     "$PYTHON" -m venv "$VENV" 
  13.     PIP="$VENV/bin/pip" 
  14. else 
  15.     PIP="pip" 
  16. fi 
  17.  
  18. "$PIP" install -r "$REQUIREMENTS" 

注意這里是以 venv 為虛擬環(huán)境依賴的, 而不是我上面提到的 poetry . 使用 venv 的原因是線上一般是一個機器跑一個項目, 同時生產的機器都追求穩(wěn)定, 這時候venv簡單而穩(wěn)定的好處就體現(xiàn)出來了, 所以比較推薦在線上使用 venv 。上面這個腳本就是創(chuàng)建一個虛擬環(huán)境, 然后根據(jù) requirements-dev.txt 安裝測試環(huán)境依賴。

依賴部分搞定了, 接下來就是告訴 Github action 該如何進行代碼質量檢查了, 于是編寫一個check的腳本:

  1. #!/bin/sh -e 
  2.  
  3. export PREFIX="" 
  4. if [ -d 'venv' ] ; then 
  5.     export PREFIX="venv/bin/" 
  6. fi 
  7.  
  8. set -x 
  9. echo 'use venv path:' ${PREFIX} 
  10. ${PREFIX}mypy . 
  11. ${PREFIX}flake8 
  12. ${PREFIX}isort . 
  13. ${PREFIX}black . 
  14. ${PREFIX}autoflake --in-place --remove-unused-variables --recursive . 

這個腳本就是簡單的調用各個命令, 命令的順序就如同上面一樣, 先進行代碼檢查, 再跑測試用例, 最后進行代碼格式化。這里的命令沒有寫各個的配置, 因為他們都會自動讀取項目下的配置文件, 與我們的本地hook保持一致。

給Github action調用的腳本創(chuàng)建好后, 就開始創(chuàng)建真正的Github action文件了。首先在項目創(chuàng)建 .github/workflows 目錄, 并在 .github/workflows 目錄創(chuàng)建 test-suite.yml 文件(文件的更多說明見官方文檔(https://docs.github.com/cn/actions/learn-github-actions/introduction-to-github-actions)):

  1. --- 
  2. # 指定workflows名稱 
  3. name: Test Suite 
  4.  
  5. # 指定操作push到master, 或者提pr到master時才執(zhí)行 
  6. on: 
  7.   push: 
  8.     branches: ["master"
  9.   pull_request: 
  10.     branches: ["master"
  11.  
  12. jobs: 
  13.   tests: 
  14.     # 設置任務名 
  15.     name: "Python ${{ matrix.python-version }}" 
  16.     # 選擇跑在哪種容器類型  
  17.     runs-on: "ubuntu-latest" 
  18.  
  19.     # 設置變量, 這里設置多個Python版本表示會對每個Python版本都運行一次 
  20.     strategy: 
  21.       matrix: 
  22.         python-version: ["3.6""3.7""3.8""3.9""3.10.0-beta.3"
  23.  
  24.     steps: 
  25.       # 調用官方的檢查和安裝python版本  
  26.       - uses: "actions/checkout@v2" 
  27.       - uses: "actions/setup-python@v2" 
  28.         with: 
  29.           python-version: "${{ matrix.python-version }}" 
  30.       # 更改腳本權限 
  31.       - name: "Change permissions" 
  32.         run: | 
  33.           chmod +x scripts/install 
  34.           chmod +x scripts/check 
  35.       # 安裝依賴 
  36.       - name: "Install dependencies" 
  37.         run: "scripts/install" 
  38.       # 進行檢查   
  39.       - name: "Run linting checks" 
  40.         run: "scripts/check" 

文件編寫完畢后就可以推送代碼到遠程了, 然后就可以到Github對應的項目地址查看action執(zhí)行情況, 一般成功結果如下(這里只測一個Python3.7, 如果失敗了, 你還會收到郵件提醒):

也可以點開查看某個步驟的詳情, 比如檢查代碼的詳情:

5.總結

這些工具都是我慢慢實踐和整合后找到最符合自己的構建 Python 項目質量的工具集了, 但是這些工具只能檢查表面情況, 而其他情況如代碼邏輯是否有問題, 則需要編寫測試用例后再運行才能知道。

而有些團隊甚至會采用壓力測試, 線上仿真測試等等, 這些工具/系統(tǒng)的引入和使用初期會帶來很大的學習和時間成本, 但它們卻能讓項目一直保持茁壯成長, 減少線上項目Bug出現(xiàn)的次數(shù)(當然這些工具還有測試用例等等也要一起跟著維護)。

責任編輯:張燕妮 來源: 博海拾貝diary
相關推薦

2022-03-25 09:22:42

代碼開發(fā)

2014-04-25 09:31:30

2022-10-11 08:00:00

人工智能機器學習數(shù)據(jù)

2011-03-07 15:49:08

2023-08-15 08:32:09

yaraQA語法規(guī)則

2019-04-01 13:46:58

工具網絡安全

2009-05-07 08:48:16

iPhone蘋果移動OS

2020-10-29 12:55:47

編程代碼開發(fā)

2024-05-14 15:28:09

Python類型提示開發(fā)

2024-06-14 12:04:33

2023-08-01 08:01:27

工具安全漏洞

2011-07-14 14:06:41

2017-01-20 09:45:20

JavaScript代碼質量

2010-05-27 12:30:52

MySQL工具

2025-03-04 00:00:33

2018-01-05 13:01:38

Python項目代碼

2024-07-03 11:02:41

2017-05-26 10:45:49

云計算公有云質量

2009-03-05 13:47:59

點贊
收藏

51CTO技術棧公眾號

美丽的姑娘在线观看免费动漫| 黄网站免费在线| 国产精品诱惑| 亚洲欧美激情视频在线观看一区二区三区 | av网站免费在线播放| 国产精品亚洲d| 亚洲你懂的在线视频| 精品日本一区二区三区| 中日韩av在线| 日韩午夜高潮| 久久精品视频在线播放| 国产 xxxx| 95精品视频| 日韩欧美黄色动漫| 日韩中文字幕亚洲精品欧美| 男女污污视频在线观看| 国产在线精品一区二区不卡了| 午夜精品一区二区三区在线视 | 成人亚洲一区| 亚洲大胆人体在线| 污网站在线免费| 手机在线观看av| 亚洲欧美日韩国产手机在线 | 狠狠躁夜夜躁人人躁婷婷91| 亚洲国产精品影视| 激情视频在线观看免费| 国产成人免费在线观看| 国产日韩在线播放| 人妻 日韩精品 中文字幕| 欧美久久久久| 日韩视频永久免费观看| 在线观看福利片| 日韩精品一区国产| 91精品国产色综合久久ai换脸| 青青草原av在线播放| 国产探花视频在线观看| 中文字幕一区二区三区乱码在线| 日本精品一区二区三区视频| 亚洲人成色777777老人头| 国产麻豆精品久久一二三| 国产精品久久久久久av下载红粉| 日韩成人在线免费视频| 午夜欧美理论片| 久久夜色精品国产亚洲aⅴ| 少妇的滋味中文字幕bd| 精品视频亚洲| 亚洲欧美国产精品va在线观看| 午夜剧场免费看| 中文字幕区一区二区三| 日韩一区二区高清| 午夜免费福利网站| 国产精品日本一区二区三区在线| 欧美日韩国产一级| 日韩大片一区二区| 久久久久久久性潮| 欧美精品在线观看播放| 午夜一区二区视频| 91麻豆精品一二三区在线| 91精品欧美久久久久久动漫| 亚洲精品mv在线观看| 91成人小视频| 日韩欧美国产1| 精品人妻二区中文字幕| caoporn成人| 亚洲成人动漫在线播放| japanese在线观看| 五月综合久久| 一区二区三欧美| avhd101老司机| 亚洲成av人电影| 欧美国产精品人人做人人爱| 国产亚洲精品码| 一本色道久久综合| 国产精品91久久| 中文字幕在线2018| 国产伦精品一区二区三区免费| 亚洲自拍偷拍视频| 日本人妻熟妇久久久久久| 99精品国产一区二区三区不卡| 欧美精品一区二区视频| 思思99re6国产在线播放| 亚洲人成在线播放网站岛国| 天天爱天天做天天操| 日本在线观看大片免费视频| 欧美日韩国产一区二区| 婷婷丁香激情网| 日韩精品一区二区三区中文字幕 | www.日本高清| 精品国产精品| 欧美精品性视频| 国产一区二区99| 理论片日本一区| 国产精品国产精品国产专区不卡| 欧洲天堂在线观看| 国产精品福利一区| 欧美视频免费看欧美视频| 久久野战av| 欧美成人乱码一区二区三区| 在哪里可以看毛片| 你懂的视频一区二区| 欧美一级淫片videoshd| 国产美女精品视频国产| www.激情成人| 欧美 日韩 国产 在线观看| cao在线视频| 欧美精品日韩一区| 亚洲成人日韩在线| 欧美黄色一区| 国产精品欧美激情在线播放| 国精产品一品二品国精品69xx | 日韩av有码在线| 亚洲精品一区二区三区在线播放| 99国内精品| 亚洲自拍偷拍一区| 国产51人人成人人人人爽色哟哟| 亚洲最快最全在线视频| 男人添女人下面免费视频| 卡通动漫国产精品| 美女黄色丝袜一区| 探花国产精品一区二区| 99精品久久99久久久久| 国产日韩亚洲欧美在线| 国产精品无码久久久久| 亚洲欧美综合另类中字| 国产午夜视频在线播放| 国产成人在线影院| 永久免费精品视频网站| 日韩电影免费观| 亚洲国产精品小视频| 日韩一级片av| 黄页视频在线91| 亚洲精品免费在线看| 超碰一区二区| 日韩成人久久久| 天天操天天射天天爽| 国产一区福利在线| 一区二区免费电影| 国产欧美自拍| 亚洲一区二区久久久| 特黄视频免费看| 91免费观看国产| 成人网站免费观看入口| 国产成人一二| 国内久久久精品| 免费av网站观看| 亚洲国产精品人人做人人爽| 蜜桃视频无码区在线观看| 国产精品久久久久久麻豆一区软件 | 丁香婷婷深情五月亚洲| 免费极品av一视觉盛宴| 一区二区三区亚洲变态调教大结局| 久久人人爽人人爽爽久久| 亚洲天堂手机版| 自拍偷自拍亚洲精品播放| www.com污| 一本一本久久a久久综合精品| 成人情趣片在线观看免费| 黄网址在线观看| 777午夜精品免费视频| 天堂网avav| 成人综合在线观看| 免费看日本毛片| 欧美男人操女人视频| 欧美在线激情视频| 国产在线观看网站| 欧美日韩国产片| 极品久久久久久| 成人av电影在线| www.浪潮av.com| 欧美日韩精品在线一区| 日本亚洲精品在线观看| 第一视频专区在线| 6080午夜不卡| 国产乡下妇女做爰| 久久女同性恋中文字幕| 九九九九九国产| 欧美日韩国产高清| 麻豆传媒一区| 国产成人福利夜色影视| 欧美日韩不卡合集视频| 亚州av在线播放| 欧美少妇一区二区| 亚洲精品在线观看av| 久久久久久99精品| 蜜桃91精品入口| 无码人妻精品一区二区三区夜夜嗨| 国产精品久久国产精品| 91福利区在线观看| 在线国产精品视频| 性猛交xxxx乱大交孕妇印度| 欧美日韩亚洲国产一区 | 欧美国产综合一区二区| 97人人模人人爽人人澡| 一本久道久久久| 亚洲日本理论电影| 国产毛片久久久| 国产精品久久久久国产a级| 手机在线免费看av| 国产亚洲精品美女| 欧美一区二区黄片| 欧美日韩免费高清一区色橹橹| 豆国产97在线 | 亚洲| 欧美国产1区2区| 午夜男人的天堂| 极品销魂美女一区二区三区| 欧美黑人经典片免费观看| 天天射天天综合网| 日本一区二区三区视频在线观看| 日韩在线精品强乱中文字幕| 国产精品电影观看| 国产高清视频色在线www| 日韩天堂在线视频| 美国一级片在线免费观看视频| 日韩视频一区二区三区| 波多野结衣在线观看一区| 精品成人乱色一区二区| 夫妻性生活毛片| 日本一区二区三区四区在线视频| 亚洲av成人精品一区二区三区| 黄色小说综合网站| 国产精品视频黄色| 美女诱惑黄网站一区| 成年人看的毛片| 欧美三级网页| 91免费视频黄| 97色伦图片97综合影院| 水蜜桃一区二区| 伊人久久大香线蕉无限次| 大波视频国产精品久久| 国产一区二区| 成人激情av在线| 日韩免费在线电影| 国产精品高清在线观看| 欧美gay视频| 欧亚精品在线观看| 日韩伦理精品| 69精品小视频| 国产网站在线| 97精品国产97久久久久久| 天堂成人av| 欧美福利在线观看| 调教一区二区| 久久久久久香蕉网| 91超碰在线免费| 97成人在线视频| 欧美成人资源| 国产成人欧美在线观看| 久久久久久久| 国产精品av在线播放| **在线精品| 国产精品久久久久久久久久久久久久| 亚洲第一影院| 国产精品扒开腿做爽爽爽视频| 最新欧美电影| 国产精品视频一| 久久亚洲国产精品尤物| 国产在线拍偷自揄拍精品| 超碰国产精品一区二页| 91视频免费网站| 亚洲一区二区电影| 国产日韩欧美综合精品| 日韩电影在线观看完整免费观看| 蜜桃视频在线观看成人| 精品视频免费在线观看| 在线看成人av电影| 欧美精品99| 欧美日本视频在线观看| 久久久久91| 91国内在线播放| 粉嫩av一区二区三区粉嫩| 成人手机在线免费视频| 欧美激情一区二区三区蜜桃视频| 国产精品嫩草影院俄罗斯| 曰韩精品一区二区| 久久黄色精品视频| 欧美日韩成人在线| 亚洲成人中文字幕在线| 日韩的一区二区| 999国产在线视频| 欧美日韩成人精品| 免费福利视频一区二区三区| 国产精品综合网站| 草草视频在线一区二区| 日韩av高清在线播放| 91成人精品| 国产成人黄色片| 麻豆成人av在线| 李丽珍裸体午夜理伦片| 国产精品传媒视频| 日本特黄一级片| 欧美日韩高清在线| 无码精品人妻一区二区三区影院| 永久免费看mv网站入口亚洲| 国产啊啊啊视频在线观看| 国产精品91在线| 欧美1区2区3区4区| 在线视频欧美一区| 模特精品在线| 自拍一级黄色片| 国产日韩欧美制服另类| 欧美国产在线看| 欧美偷拍一区二区| 天堂网av在线播放| 久久国产精品久久久| 欧洲一区二区三区精品| eeuss一区二区三区| 日韩国产综合| 成年人免费大片| 成人视屏免费看| 久草福利资源在线| 欧美性猛交xxxx黑人| 精品国产亚洲av麻豆| 中文欧美在线视频| 日韩av影片| 国产区日韩欧美| 欧美一区二区| 中文字幕国产免费| 久久免费视频色| 日本少妇吞精囗交| 日韩久久免费av| 看黄网站在线| 国产精品视频一| 精品日本12videosex| 日本不卡在线观看视频| 成人网在线免费视频| 日韩一级片大全| 欧美日韩第一区日日骚| 国产黄色免费在线观看| 欧美中在线观看| 久久久久久久久久久久久久久久久久久久 | 91精品国产99| 嗯用力啊快一点好舒服小柔久久| 欧美少妇一区二区三区| 国产综合久久久久影院| 影音先锋男人看片资源| 色av综合在线| 黄上黄在线观看| 欧美做受高潮1| 欧美日韩123| 88av.com| 国产三级一区二区三区| 嫩草影院一区二区三区| 亚洲精品小视频| 欧美电影h版| 日韩不卡av| 麻豆精品精品国产自在97香蕉 | 一区二区三区四区在线免费观看| 国产精品久久久久久69| 深夜精品寂寞黄网站在线观看| 91福利精品在线观看| 亚洲欧美99| 国内外成人在线视频| 亚洲天堂黄色片| 精品日韩欧美在线| 九九精品调教| 国产亚洲一区在线播放| 一本久道久久综合婷婷鲸鱼| 日本高清www| 欧美午夜片在线观看| 日本欧美在线视频免费观看| 91在线视频免费| 午夜精品网站| 在线观看国产三级| 日本韩国欧美三级| 婷婷五月在线视频| 91免费视频国产| 禁久久精品乱码| 一级性生活大片| 欧美丝袜丝交足nylons| 黄色在线免费网站| 国产精品福利视频| 老牛影视一区二区三区| 黄色精品视频在线观看| 日韩午夜激情免费电影| 国产高潮在线| 亚洲高清在线观看一区| 国产一区视频在线看| 国产手机在线视频| 国产亚洲欧美视频| 精品国产亚洲一区二区三区大结局| 人妻互换免费中文字幕| 91小视频在线观看| 在线免费观看一区二区| 欧美激情xxxx| 精品国产乱码久久久| 午夜大片在线观看| 精品久久久免费| 日本免费在线观看| 九色一区二区| 国产真实精品久久二三区| 日韩av一二三区| 日韩亚洲精品视频| 国产一区精品福利| 日韩国产欧美亚洲| 亚洲女同ⅹxx女同tv| 欧美777四色影视在线| 99re国产在线播放| 日本欧美一区二区三区| 国产在线精品观看| 久久久av一区|