為什麼你應該在專案中使用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的更多資訊,我建議你閱讀其優秀的文件。
相關文章
- 為專案應用設定No-PIE
- 為什麼成本管理在專案管理中很重要專案管理
- 在專案中應該使用Boolean還是使用boolean?Boolean
- 為什麼你永遠不應該在CSS中使用px來設定字型大小CSS
- [譯] 為什麼你應該開始使用 KotlinKotlin
- 為什麼專案開發永遠缺乏合理的時間?
- 專案實戰之gradle在實際專案中的使用Gradle
- 使用 TypeScript 開發你的專案TypeScript
- 新專案為什麼決定用 JDK 17了JDK
- 還在為找開源專案發愁麼?或許這個專案能幫助你
- 專案成本管理軟體能為你做什麼?
- 探究為什麼在專案管理中使用資料視覺化?專案管理視覺化
- 為什麼你在辛苦做專案國際化,而別人在喝茶?
- 你的專案應該如何分層?
- 專案實戰之Rxjava、RxBinding在實際專案中的使用RxJava
- Objc Runtime在專案中該怎麼用OBJ
- 夜遊專案的開發應該注意哪些
- 為什麼 Python 開發人員應該使用 PipenvPython
- 從1100多個專案中吸取的教訓:為什麼軟體專案需要英雄?
- 為什麼專案老夭折?這份專案管理指南請收好專案管理
- 在專案管理中,專案成員不能及時完不成任務,應該怎麼做?專案管理
- python開發本地WEB專案PythonWeb
- 為什麼同樣的專案,他能賺錢,你卻不能
- 在 Laradock 中開發 Vue 專案Vue
- 專案儀表板在專案管理軟體中的功能是什麼專案管理
- 為什麼 StackOverflow 上的程式碼片段會摧毀你的專案?
- NuGet是什麼?為什麼.NET專案中會有NuGet?如何使用NuGet程式包?
- 為什麼RPA專案失敗了呢?
- 淺談設計模式在iOS開發實戰專案中的應用設計模式iOS
- 京東二面:為什麼需要分散式ID?你專案中是怎麼做的?分散式
- 華為雲開源專案Sermant正式成為CNCF官方專案
- Spring在開發專案中起的作用Spring
- 說說你做過讓你覺得最滿意的專案是什麼?為什麼?
- 你的專案應該如何正確分層?
- 大型開發專案中 git 工作流的最佳實踐Git
- 10 個你應該知道的 PHP 比特幣開源專案PHP比特幣
- 8 個你應該瞭解的環保開源專案
- 一個優質的專案應該具有什麼特點