為什麼你應該在專案中使用pyenv+Pipenv:為專案設定超棒的本地開發工作流之祕籍
譯者評價:
軟體開發者對工程環境、對開發工具的追求是不會止步的。隨著開發要素的變遷,工具會不斷演進、創新,來適應新的需求,解決面臨的各類問題。開發者對新工具的挖掘/理解/採納,也會反覆迴圈。我們肯定得考慮切換工具的成本,但是也不能固步自封,因循守舊。這個就要自行評估和平衡了。
這篇文章中,對Python專案的控制管理分成兩個部分:Python直譯器交給pyenv,專案中使用的Python包交給Pipenv。確實是一個很不錯的選擇。
這是一種個人強烈推薦的在本地使用Python進行開發的的辦法。你可能已經發現了,不同專案有著不同Python版本的依賴項,針對管理這些專案是很麻煩的。
更為複雜的是,有多種方法可以安裝Python:
- 作業系統預安裝
- 使用brew 或者 apt 這樣的包管理器
- 使用www.python.org上的二進位制檔案
- 使用pyenv-easy方法安裝和管理Python安裝過程?
本指南使用pyenv來管理Python安裝,使用Pipenv來管理專案依賴項(而不是原始pip)。
安裝pyenv
讓我們通過brew安裝:
$ brew install pyenv
如果你不在Mac上,請參閱pyenv的安裝說明。
將以下內容新增到〜/ .bash_profile或〜/ .bashrc(取決於你的shell)以在終端載入時自動初始化pyenv:
eval “$(pyenv init -)”
譯者注:pyenv有個自動安裝器,更簡單易用,看博主上一篇文章。
pyenv如何工作?
檢視所有可用的Python版本:
$ pyenv install –list
讓我們安裝Python 3.6.6
$ pyenv install 3.6.6 Installed Python-3.6.6 to /Users/dvf/.pyenv/versions/3.6.6
pyenv不會更改你的全域性直譯器,除非你告訴它:
$ python –version
Python 2.7.14
$ pyenv global 3.6.6
Python 3.6.6
pyenv允許你將不同版本的python本地安裝到一個目錄中。讓我們建立一個針對python 3.7.0的專案:
$ pyenv install 3.7.0
Installed Python-3.7.0 to /Users/dvf/.pyenv/versions/3.7.0
$ mkdir my_project && cd my_project
$ python –version
Python 3.6.6
$ pyenv local 3.7.0
$ python –version
Python 3.7.0
現在,只要你發現自己在my_project中,你就會自動使用Python 3.7.0直譯器。
搞明白沒有?如果沒有,停在這裡並花一些時間來搗鼓pyenv-它的工作原理是在〜/ .pyenv中安裝所有Python直譯器,並根據你當前的目錄動態調整你的$ PATH。
Pipenv是什麼?它是如何運作的?
Pipenv是官方推薦的管理專案依賴關係的方式。 與在專案中擁有requirements.txt檔案和管理virtualenv不同,現在你的專案中有一個Pipfile檔案,可以自動完成所有這些工作。
首先通過pip安裝它,這是一個快速發展的專案,因此請確保你擁有最新版本(撰寫本文時為2018.10.13):
pip install -U pipenv
首次使用 Pipenv 讓我們在你的專案中設定Pipenv:
$ cd my_project
$ pipenv install
Creating a virtualenv for this project…
Pipfile: /Users/dvf/my_project/Pipfile
Using /Users/dvf/.pyenv/versions/3.7.0/bin/python3.7 (3.7.0) to create virtualenv…
你將在專案中找到兩個新檔案:Pipfile和Pipfile.lock。
如果你在現存的專案中安裝,Pipenv會將你的舊requirements.txt轉換為Pip檔案。 夠酷吧? 對於新專案,PipFile應該是這樣的:
[[source]]
url = “https://pypi.org/simple”
verify_ssl = true
name = “pypi”
[packages]
[dev-packages]
[requires]
python_version = “3.7”
請注意,我們這裡沒有啟用任何虛擬環境,Pipenv為我們處理虛擬環境。 因此,安裝新的依賴項很簡單:
$ pipenv install django
Installing django
…
Installing collected packages: pytz, django
Successfully installed django-2.1.2 pytz-2018.5
Adding django to Pipfile’s [packages]…
Pipfile.lock (4f9dd2) out of date, updating to (a65489)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (4f9dd2)!
Installing dependencies from Pipfile.lock (4f9dd2)…
? ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 2/2 — 00:00:01
To activate this project’s virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
如果你檢查Pipfile,你會發現它現在包含django =“*”作為依賴項。
如果我們想在開發期間安裝dev依賴項以供使用,例如YAPF,則需要在安裝步驟中新增–dev:
$ pipenv install –dev yapf
什麼是Pipfile.lock檔案?
Pipfile.lock檔案非常重要,因為它做了兩件事:
通過保持每個已安裝包的雜湊值來提供良好的安全性。 引入所有依賴項和子依賴項的版本,為你提供可複製的環境。 讓我們看看它目前的樣子:
{
"_meta": { "hash": { "sha256": "627ef89...64f9dd2" }, "pipfile-spec": 6, "requires": { "python_version": "3.7" }, "sources": [ { "name": "pypi", "url": "https://pypi.org/simple", "verify_ssl": true } ] }, "default": { "django": { "hashes": [ "sha256:acdcc1...ab5bb3", "sha256:efbcad...d16b45" ], "index": "pypi", "version": "==2.1.2" }, "pytz": { "hashes": [ "sha256:a061aa...669053", "sha256:ffb9ef...2bf277" ], "version": "==2018.5" } }, "develop": {}
}
請注意,每個依賴項的版本都是固定的。如果沒有很好的理由,你肯定總是希望將此檔案提交給你的原始碼管理系統。
自定義索引
在Pipenv出現之前,我們一直很難使用私有的Python倉庫。例如,你想在組織內託管私有Python倉庫。 現在你需要做的就是將它們定義為Pipfile中的附加源:
[[source]]
url = “https://pypi.org/simple”
verify_ssl = true
name = “pypi”
[[source]]
url = “https://www.example.com”
verify_ssl = true
name = “some-repo-name”
[packages]
django = “*”
my-private-app = {version=”*”, index=”some-repo-name”}
[dev-packages]
[requires]
python_version = “3.7”
請注意,我們告訴my-private-app使用私有倉庫。 如果省略,Pipenv將遍歷索引,直到找到包。
?Pipenv還將使用值中的任何環境變數,如果你有不想放在原始碼管理系統中的敏感憑據(這是我的貢獻</ humblebrag>),這將是非常有用的。
部署時,如果安裝的依賴項與Pipfile.lock不匹配,則知道部署失敗非常重要。 所以你應該在你的安裝步驟中新增–deploy,如同這樣:
$ pipenv install –deploy
你還可以檢查哪些依賴項不匹配:
$ pipenv check
並檢視這些包安裝了哪些子依賴項:
$ pipenv graph –reverse
pip==18.1
pytz==2018.5
– Django==2.1.2 [requires: pytz]
setuptools==40.4.3
wheel==0.32.2
yapf==0.24.0
一次性命令,指令碼和啟用虛擬環境 如果你正在積極開發一個專案,則啟用虛擬環境會很有幫助:
$ pipenv shell
Launching subshell in virtual environment…
(my_project) ➜ my_project
或者,如果你想在虛擬環境中執行命令:
$ pipenv run python manage.py runserver
你還可以向pipfile新增類似於npm package.json的指令碼:
[[source]]
url = “https://pypi.org/simple”
verify_ssl = true
name = “pypi”
[packages]
django = “*”
[dev-packages]
yapf = “*”
[scripts]
server = “python manage.py runserver”
[requires]
python_version = “3.7”
現在你可以執行指令碼:
$ pipenv run server
我們剛剛觸及冰山一角。 如果你想了解有關Pipenv的更多資訊,我建議你閱讀其優秀的文件。
相關文章
- 為什麼你應該參與到開源專案中
- 為什麼iOS專案應該用CocoaPodsiOS
- 為什麼程式設計師應該架空專案經理程式設計師
- 專案經理之專案經理應該做什麼
- 為什麼應該要做好專案結構的規劃
- 為什麼你應該為開源做設計
- 專案交付為什麼失敗?-記我在某個專案中的迷思
- 為專案應用設定No-PIE
- 專案註定延期時,應該做什麼?
- 為什麼成本管理在專案管理中很重要專案管理
- 討論:你的專案為什麼不迭代?
- 為什麼你的專案要花這麼長時間?
- 為什麼專案會延期?
- 為什麼你永遠不應該在CSS中使用px來設定字型大小CSS
- 在專案中應該使用Boolean還是使用boolean?Boolean
- 專案研發為什麼失敗?(轉)
- 為什麼專案開發永遠缺乏合理的時間?
- [譯] 為什麼你應該開始使用 KotlinKotlin
- 新專案為什麼決定用 JDK 17了JDK
- 軟體專案管理的研究及在專案開發中的應用專案管理
- 專案成本管理軟體能為你做什麼?
- 專案研發為什麼會失敗?(轉)
- 為什麼越來越少的開源專案使用 GPL 協議協議
- 為什麼程式設計師的開發專案總是半途而廢?程式設計師
- 還在為找開源專案發愁麼?或許這個專案能幫助你
- 使用 TypeScript 開發你的專案TypeScript
- 為什麼你在辛苦做專案國際化,而別人在喝茶?
- 「譯」Python 專案應該都有什麼?Python
- 探究為什麼在專案管理中使用資料視覺化?專案管理視覺化
- 為什麼很多企業的神祕顧客專案收效甚微
- 為什麼你應該學習程式設計程式設計
- 為什麼你應該使用一個PHP框架PHP框架
- 轉享:為什麼你應該使用Play框架?框架
- 你的專案應該如何分層?
- 在開發專案中進行有效的專案管理(轉)專案管理
- 京東二面:為什麼需要分散式ID?你專案中是怎麼做的?分散式
- 如何為iOS專案開發FrameworkiOSFramework
- [譯]為什麼你應該在相等比較中使用 Object.is()Object