requests作者推薦:更好的pip工作流

jopen 8年前發布 | 8K 次閱讀 工作流 Flask

現在大家開發Python應用時,在代碼庫的根目錄中添加一個 requirements.txt 文件已經成了標準實踐。

這個文件用處挺多,一般有以下兩種形式:

  • 項目的頂層依賴包清單(top-level dependencies),通常不會指定版本號
  • 項目的全部依賴包清單,每個依賴包都指定版本號

方法1:簡單的 requirements 文件

項目的頂層依賴包清單,通常不會指定版本號。

$ cat requirements.txt
requests[security]
flask
gunicorn==19.4.5

方法1非常簡單,也是每個使用 requirements 文件的開發者希望獲得的用戶體驗。但是,如果將這樣一個 requirements.txt 文件部署到生產環境,有可能會出現預料之外的問題。因為你沒有指定版本號,所以在運行 pip install 后,你今天安裝的Python包可能和明天安裝的就會不一樣。

這是很糟糕的。因為子依賴包可能經常更新版本號,所以重新運行 pip install -r requirements.txt 可能會讓你安裝不一樣的Python包。這有可能會讓你的應用因為未知的原因而無法運行。

方法2:精確的 requirements 文件

項目的全部依賴包清單,每個依賴包都指定版本號

$ cat requirements.txt
cffi==1.5.2
cryptography==1.2.2
enum34==1.1.2
Flask==0.10.1
gunicorn==19.4.5
idna==2.0
ipaddress==1.0.16
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
ndg-httpsclient==0.4.0
pyasn1==0.1.9
pycparser==2.14
pyOpenSSL==0.15.1
requests==2.9.1
six==1.10.0
Werkzeug==0.11.4

方法2是部署應用時應采取的最佳實踐,可以確保你的運行環境不會出現問題。

所有的依賴包,包括子依賴包都明確列出,而且指定了各自的版本號。

這種類型的 requirements.txt 是在應用當前工作運行環境下,運行 pip freeze 命令自動生成的。這種做法鼓勵開發者平等對待開發/生產環境(dev/prod parity),對待外部依賴包,就像對待本身應用的代碼一樣尊敬(因為它們也是你應用代碼的一部分)。

麻煩之處

盡管方法2是使用 requirements.txt 的最佳實踐,但實際上還是有點麻煩。舉個例子,如果我有一個較大的代碼庫,希望通過 pip install --upgrade 命令更新部分或全部Python包,我沒有辦法輕松地做到這點。

之前我的方法是,一個一個地把頂層的依賴包挑出來,然后手動輸入 pip install requests[security] flask --upgrade 。這個過程可不好受。

我思考了很久,還想過要開發一個工具來解決這個問題。當然,現在已經有了像 pip-tools 這樣的工具。可是,我不想再往自己的工具鏈(tool chain)里加東西了;這個問題應該利用已有的工具就能解決。

最后,我想出了一個很好的方案,利用我現有的工具解決了這個問題,而且兼具方法1和方法2的優勢。我已經在項目中使用這個工作流一段時間,對結果非常滿意。

工作流

其實很簡單:我們不只放一個 requirements 文件,而是兩個:

  • requirements-to-freeze.txt
  • requirements.txt

requirements-to-freeze.txt

requests[security]
flask
gunicorn==19.4.5

requirements.txt

cffi==1.5.2
cryptography==1.2.2
enum34==1.1.2
Flask==0.10.1
gunicorn==19.4.5
idna==2.0
ipaddress==1.0.16
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
ndg-httpsclient==0.4.0
pyasn1==0.1.9
pycparser==2.14
pyOpenSSL==0.15.1
requests==2.9.1
six==1.10.0
Werkzeug==0.11.4

requirements-to-freeze.txt 遵循的是方法1,文件中說明了項目的頂層依賴包,以及你需要指定的明確版本號。

requirements.txt 遵循的是方法2,其中的內容是運行 pip install requirements-to-freeze.txt 命令后, pip freeze 生成的。

基本用法

$ cd project-repo

$ pip install -r requirements-to-freeze.txt --upgrade Installing collected packages: six, enum34, ipaddress, ...

$ pip freeze > requirements.txt</pre>

魚與熊掌,二者兼得。

我建議你嘗試一下這個工作流,很有可能會避免你未來碰到構建失敗等問題。

來自: http://www.codingpy.com/article/a-better-pip-workflow-recommended-by-kenneth/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!