英文| nox tutorialhtml
出處| nox 官方文檔python
譯者| 豌豆花下貓@Python貓git
Github地址:https://github.com/chinesehuazhou/nox_doc_cngithub
聲明:本翻譯基於CC BY-NC-SA 4.0受權協議,內容略有改動,轉載請保留原文出處,請勿用於商業或非法用途。docker
本教程將引導你學會安裝、配置和運行 Nox。django
Nox 能夠經過pip輕鬆安裝:segmentfault
python3 -m pip install nox
你可能但願使用用戶站點(user site)來避免對全局的 Python install 形成混亂:session
python3 -m pip install --user nox
或者,你也能夠更精緻,使用pipx:app
pipx install nox
不管用哪一種方式,Nox 一般是要全局安裝的,相似於 tox、pip和其它相似的工具。框架
若是你有興趣在docker 內運行 nox,可使用 DockerHub 上的thekevjames/nox鏡像,它包含全部 nox 版本的構建與及全部支持的 Python 版本。
若是你想在GitHub Actions中運行 nox ,則可使用Activatedleigh/setup-nox action,它將安裝最新的 nox,並令 GitHub Actions 環境提供的全部 Python 版本可用。
Nox 經過項目目錄中一個名爲 noxfile.py 的文件做配置 。這是一個 Python文件,定義了一組會話(sessions)。一個會話是一個環境和一組在這個環境中運行的命令。若是你熟悉 tox,會話就相似於它的環境。若是你熟悉 GNU Make,會話則相似於它的 target。
會話使用 @nox.session 裝飾器做聲明。這方式相似於 Flask 使用 @app.route。
下面是一個基本的 Nox 文件,對 example.py 運行flake8(你能夠本身建立example.py):
import nox @nox.session def lint(session): session.install("flake8") session.run("flake8", "example.py")
如今,你已經安裝了 Nox 並擁有一個配置文件, 那就能夠運行 Nox 了!在終端中打開項目的目錄,而後運行nox
。你應該會看到相似這樣的內容:
$ nox nox > Running session lint nox > Creating virtualenv using python3.7 in .nox/lint nox > pip install flake8 nox > flake8 example.py nox > Session lint was successful.
✨如今你已第一次成功地使用 Nox 啦!✨
本教程的其他部分將帶你學習其它能夠用 Nox 完成的常見操做。若是須要的話,你還能夠跳至命令行用法和配置&API文檔。
Nox 基本上是將 session.install 傳遞給 pip ,所以你能夠用一般的方式來安裝東西。這裏有一些例子:
(1)一次安裝一個或多個包:
@nox.session def tests(session): # same as pip install pytest protobuf>3.0.0 session.install("pytest", "protobuf>3.0.0") ...
(2)根據 requirements.txt 文件安裝:
@nox.session def tests(session): # same as pip install -r -requirements.txt session.install("-r", "requirements.txt") ...
(3)若是你的項目是一個 Python 包,而你想安裝它:
@nox.session def tests(session): # same as pip install . session.install(".") ...
session.run 函數可以讓你在會話的虛擬環境的上下文中運行命令。如下是一些示例:
(1)你能夠安裝和運行 Python 工具:
@nox.session def tests(session): session.install("pytest") session.run("pytest")
(2)若是你想給一個程序傳遞更多的參數,只需給 run 添加更多參數便可:
@nox.session def tests(session): session.install("pytest") session.run("pytest", "-v", "tests")
(3)你還能夠傳遞環境變量:
@nox.session def tests(session): session.install("black") session.run( "pytest", env={ "FLASK_DEBUG": "1" } )
有關運行程序的更多選項和示例,請參見nox.sessions.Session.run()。
一旦你的 Noxfile 中有多個會話,你會注意到 Nox 將默認運行全部的會話。儘管這頗有用,可是一般一次只須要運行一兩個。
你可使用--sessions
參數(或-s
)來選擇要運行的會話。你可使用--list
參數顯示哪些會話可用,哪些將會運行。這裏有一些例子:
這是一個具備三個會話的 Noxfile:
import nox @nox.session def test(session): ... @nox.session def lint(session): ... @nox.session def docs(session): ...
若是你只運行nox --list
,則會看到全部會話都被選中:
Sessions defined in noxfile.py: * test * lint * docs sessions marked with * are selected, sessions marked with - are skipped.
若是你運行nox --list --sessions lint
,Nox 將只運行 lint 會話:
nox > Running session lint nox > Creating virtualenv using python3 in .nox/lint nox > ... nox > Session lint was successful.
還有更多選擇和運行會話的方法!你能夠在命令行用法中閱讀更多有關調用 Nox 的信息。
許多項目須要支持一個特定的 Python 版本或者多個 Python 版本。你能夠經過給 @nox.session 指定 Python,來使 Nox 針對多個解釋器運行會話。這裏有一些例子:
(1)若是你但願會話僅針對 Python 的單個版本運行:
@nox.session(python="3.7") def test(session): ...
(2)若是你但願會話在 Python 的多個版本上運行:
@nox.session(python=["2.7", "3.5", "3.7"]) def test(session): ...
你會注意到,運行nox --list
將顯示此會話已擴展爲三個不一樣的會話:
Sessions defined in noxfile.py: * test-2.7 * test-3.5 * test-3.7
你可使用nox --sessions test
運行全部 test 會話,也可使用列表中顯示的全名來運行單個 test 會話,例如,nox --sessions test-3.5
。有關選擇會話的更多詳細信息,請參見命令行用法文檔。
你能夠在會話的virtualenv配置裏,閱讀到更多關於配置會話所用的虛擬環境的信息。
一些項目,特別是在數據科學社區,須要在 conda 環境中測試其使用的狀況。若是你但願會話在 conda 環境中運行:
@nox.session(venv_backend="conda") def test(session): ...
使用 conda 安裝軟件包:
session.conda_install("pytest")
能夠用 pip 安裝軟件包進 conda 環境中,可是最好的實踐是僅使用--no-deps
選項安裝。這樣能夠避免 pip 安裝的包與 conda 安裝的包不兼容,防止 pip 破壞 conda 環境。
session.install("contexter", "--no-deps") session.install("-e", ".", "--no-deps")
就像 Nox 能夠控制運行多個解釋器同樣,它也可使用nox.parametrize()裝飾器,來處理帶有一系列不一樣參數的會話。
這是一個簡短示例,使用參數化對兩個不一樣版本的 Django 進行測試:
@nox.session @nox.parametrize("django", ["1.9", "2.0"]) def test(session, django): session.install(f"django=={django}") session.run("pytest")
若是運行nox --list
,你將會看到 Nox 把一個會話擴展爲了多個會話。每一個會話將得到你想傳遞給它的一個參數值:
Sessions defined in noxfile.py: * test(django='1.9') * test(django='2.0')
nox.parametrize() 的接口和用法特地相似於pytest的parametrize。這是 Nox 的一項極其強大的功能。你能夠在參數化會話上,閱讀更多有關參數化的信息與示例。
(譯註:關於 pytest 和其它主流測試框架是如何使用參數化功能的?請參閱《Python 中如何實現參數化測試?》)
看看你!你如今基本上是一個 Nox 專家啦!✨
到了這一步,你還能夠:
玩得開心!💜
[1] nox tutorial: https://nox.thea.codes/en/sta...
[2] pip: https://pip.readthedocs.org/
[3] 用戶站點: https://packaging.python.org/...
[4] pipx: https://packaging.python.org/...
[5] docker: https://www.docker.com/
[6] thekevjames/nox鏡像: https://hub.docker.com/r/thek...
[7] GitHub Actions中: https://github.com/features/a...
[8] Activatedleigh/setup-nox action: https://github.com/marketplac...
[9] flake8: http://flake8.pycqa.org/en/la...
[10] 命令行用法: https://nox.thea.codes/en/sta...
[11] 配置&API: https://nox.thea.codes/en/sta...
[12] nox.sessions.Session.run(): https://nox.thea.codes/en/sta...
[13] 會話的virtualenv配置: https://nox.thea.codes/en/sta...
[14] nox.parametrize(): https://nox.thea.codes/en/sta...
[15] pytest的parametrize: https://pytest.org/latest/par...
[16] 參數化會話上: https://nox.thea.codes/en/sta...
[17] 貢獻: https://nox.thea.codes/en/sta...
公衆號【Python貓】, 本號連載優質的系列文章,有喵星哲學貓系列、Python進階系列、好書推薦系列、技術寫做、優質英文推薦與翻譯等等,歡迎關注哦。