Python web 項目的依賴管理工具
Poetry可以幫助你聲明、管理和安裝Python項目的依賴項,確保你可以在任何地方都擁有正確的堆棧。
Poetry支持Python 2.7 和Python 3以上
安裝
Poetry提供了一個自定義安裝程序,它通過打包自己依賴項的方式來確保Poetry與系統其他部分隔離。本文推薦通過這種方法來安裝Poetry。
或者,你也可以下載並單獨執行get-poetry.py文件。
如果你想要安裝預發布版本,你可以執行get-poetry.py –preview命令:
類似地,如果你想要安裝一個特定的版本,你可以使用命令 --version:
也可以使用pip來安裝poetry。
然而請註意,它還將繼續安裝Poetry的依賴,而這很可能會引起沖突。
升級 poetry
將poetry升級到最新的穩定版本只需要簡單的調用self:update命令。
如果你想安裝預發布版本,你可以使用--preview選項。
最後,如果你想要安裝一個特定的版本,你可以把版本號作為一個參數傳遞給self:update。
為Bash、Fish或Zsh啟用tab補全功能
Poetry支持生成Bash、Fish和Zsh的自動補全腳本。完整細節請參閱poetry help completions,要點非常簡單,只要使用以下命令中的某一個:
註意:為了使更改生效,您可能需要重新啟動shell。
對於zsh,您必須在compinit之前,在~/.zshrc中添加以下行。:
簡介
poetry是一款用來處理依賴項的安裝、構建和打包成Python包的工具。只需要一個標準的pyproject.toml文件就可以完成以上所有任務。
換句話說,poetry用pyproject.toml取代了setup.py, requirements.txt, setup.cfg, MANIFEST.in 以及最新加入的Pipfile。
這裏有一些我們需要註意的事情:
l 它將嘗試將語義版本控制作為版本命名的最佳實踐。
l 你可以指定自述文件、需要包含和排除的文件:不再需要使用MANIFEST.in。Poetry也會使用VCS的忽略文件(如gitignore)來填充exclude部分。
l 可以指定(最多5個)關鍵字,並將它們作為包裝站點上的標簽。
l 依賴項部分支持插入符、波浪符、通配符、不等式和多重需求。
l 你必須指定與包兼容的python版本。
Poetry同樣也會檢測出你是否處在一個虛擬環境中並安裝相應的軟件包。這就是說,poetry可以在任何範圍內被安裝和使用。
受益於Molinillo的啟發,poetry也有一個完整的依賴項解析庫。
為什麽使用它?
在Python中,打包系統和依賴項管理是相當復雜的,對於新手來說很難理解。即使對於經驗豐富的開發人員來說,在Python項目中創建所需的所有文件有時也很麻煩:setup.py, requirements.txt, setup.cfg, MANIFEST.in以及新添加的Pipfile。
因此,我想要一個工具,它可以將所有東西限制在一個配置文件中:依賴項管理、打包和發布。
它同樣也從其他語言的工具中獲得了靈感,比如composer(PHP)或cargo(Rust)。
最後,沒有可靠的工具可以妥當地解決Python中的依賴性,所以我開發了poetry,為了給Python社區帶來一個詳盡的依賴項解析器。
Pipenv呢?
簡而言之:我不喜歡它提供的命令行界面,也不喜歡它做的一些決定,我認為我們可以做一個更好、更直觀的。下面就是pipenv裏面一些我不喜歡的東西。
依賴項解析
依賴項解析是不穩定的,即使有解決辦法但還是會失敗。讓我們舉一個例子:
將會報出這樣的錯誤:
然而Poetry就會給你帶來各組正確的包:
結果是:
這要歸功於Poetry中心的高效依賴項解析器。
下面是以上命令的具體實現情況:
oslo.utils (1.4.0) 依賴於:
l pbr (>=0.6,!=0.7,<1.0)
l Babel (>=1.3)
l six (>=1.9.0)
l iso8601 (>=0.1.9)
l oslo.i18n (>=1.3.0)
l netaddr (>=0.7.12)
l netifaces (>=0.10.4)
我們真正感興趣的是pbr (>=0.6,!=0.7,<1.0)。
在這時,poetry將選擇pbr==0.11.1,這是與約束相匹配的最新版本。
接下來,它將嘗試選擇oslo.i18n==3.20.0,這是與oslo.i18n (>=1.3.0)匹配的最新版本。
然而,這個版本需要pbr (!=2.1.0,>=2.0.0),這與pbr==0.11.1不兼容,所以poetry試圖找到某個版本的oslo.i18n來滿足pbr (>=0.6,!=0.7,<1.0)。
通過分析oslo.i18n的發布版本,它會發現oslo.i18n==2.1.0需要pbr (>=0.11,<2.0)。到這時,因為沒有了更多的沖突,其余部分的解決方法直截了當。
安裝命令
當你為install命令指定一個包時,它將被添加為一個通配符依賴項。這意味著可以安裝該軟件包的任何版本,而這很有可能導致兼容性問題。
而且,您必須顯式地告訴它,當你安裝新的軟件包時,不要升級已經被鎖定的包。這些應該是默認的。
刪除命令
如果不再需要指定的包,remove命令只會刪除包,不會刪除包的依賴項。
想要解決這個問題,你需要使用sync或clean。
有限的範圍
還有,Pipfile只是requirements.txt的替代品。到最後,你仍需要按照與你在Pipfile文件中完全相同的依賴項聲明來填充setup.py文件(或setup.cfg)。因此最終為了正確地設置項目,你還是需要管理一些配置文件。
指令
new
這個命令將以創建適合大多數項目的目錄結構的方式來啟動你的新Python項目。
將創建一個如下的文件夾:
如果您想要重命名文件夾,您可以通過輸入--name選項來實現:
init
這個命令提示你提供關於包的基本信息,這些將幫助你交互式的創建一個pyproject.toml文件。
它會交互式地要求您填充字段,同時使用一些智能默認值。
選項
--name:包的名稱。
--description:包的描述。
--author: 包的作者。
--dependency:包需要有一個版本約束。應該按照下面格式foo:1.0.0。
--dev-dependency:開發需求,更多請參閱--require。
Install
install命令會從當前目錄中讀取pyproject.toml文件,解析依賴項並安裝。
如果當前目錄中有pyproject.lock文件,它將使用來自那裏的指定版本。這確保每個使用庫的人都能得到相同版本的依賴項。
如果沒有pyproject.lock文件,Poetry將在依賴項解析後創建一個。
您可以指定no-dev選項來禁止安裝開發依賴項。
您還可以通過傳遞--E|--extras附加選項來指定您想要安裝的附加功能(請參閱附加信息以獲得更多信息)
選項
--no-dev:不要安裝開發依賴項。
-E|--extras:特性安裝(允許多值)。
Update
為了獲得依賴項的最新版本,並更新pyproject.lock文件,你應該使用update命令。
這將解決項目的所有依賴項,並將確切的版本寫入pyproject.lock。
如果你只是想更新某些軟件包,而不是全部,你可以將它們列出如下:
選項
--dry-run:輸出操作,但不會執行任何操作(隱式啟用--verbose)。
Add
add命令向pyproject.toml中添加所需的軟件包並安裝它們。
如果你沒有指定一個版本約束,那麽poetry將根據可用的包版本選擇一個合適的版本。
選項
--D|dev:添加包作為開發依賴項。
--optional:添加作為可選的依賴項。
--dry-run:輸出操作,但不會執行任何操作(隱式啟用--verbose)。
Remove
remove命令會從當前安裝的包列表中刪除一個包。
選項
--D|dev:從開發依賴項中刪除一個包。
--dry-run:輸出操作,但不會執行任何操作(隱式啟用--verbose)。
Show
要想列出所有可用的軟件包,你可以使用show指令。
如果你想要查看某個包的詳細信息,你可以把包的名稱作為參數傳遞。
選項
--tree:樹形展示依賴項。
-l|--latest:展示最新版本。
-o|--outdated:顯示最新版本,但只針對過時的軟件包。
Build
build命令會構建源和wheels檔案。
請註意,目前只支持純python wheels。
選項
-F|--format:將格式限制為wheel或sdist。
Publish
這個命令構建(如果還沒有構建)並將包發布到遠程存儲庫。
如果這是第一次提交,它會自動註冊這個包。
選項
-r|--repository:將包註冊到(默認:pypi)的存儲庫。它應該與配置命令設置的存儲庫名稱相匹配。
--username (-u):訪問存儲庫的用戶名。
--password (-p):訪問存儲庫的密碼。
Config
config命令允許你編輯poetry的配置和存儲庫。
用法
setting-key是一個配置選項名,setting-value1則是一個配置值。
修改存儲庫
除了修改配置部分之外,config命令還支持對存儲庫部分進行更改,方法如下:
這會把存儲庫foo指定的url地址設置為https://foo.bar/simple/.。
你也可以很輕松的將憑據存儲到特定的存儲庫中:
如果你沒有指定密碼,會提示你必須指定。
選項
--unset:刪除由setting-key命名的配置元素。
--list:顯示當前配置變量的列表。
Search
這個命令會在遠程索引上搜索包。
選項
-N|--only-name:只在名字中搜索。
Lock
這個命令會鎖定(而且不安裝)在pyproject.toml中指定的依賴項。
pyproject.toml文件
pyproject.toml中的tool.poetry部分由多個部分組成。
名字
包的名字。必須
版本
包的版本。必須
這裏應該遵循語義版本控制。然而它不會被強制執行,你可以自由地遵循其他規範。
描述
對包的簡短描述。必須
許可證
包的許可證。
最常見的許可證的推薦符號是(按字母排列):
l Apache-2.0
l BSD-2-Clause
l BSD-3-Clause
l BSD-4-Clause
l GPL-2.0
l GPL-2.0+
l GPL-3.0
l GPL-3.0+
l LGPL-2.1
l LGPL-2.1+
l LGPL-3.0
l LGPL-3.0+
l MIT
可選,但強烈建議提供。更多的標識符在SPDX開放源碼許可註冊表中列出。
作者
這個包的作者。這是一個作者列表,應該包含至少一個作者。
作者必須以名字 <郵箱地址>的形式出現。
自述
包的自述文件。必須
文件可以是README.rst或README.md。
主頁
一個到項目網站的URL地址。可選
存儲庫
一個到項目存儲庫的URL地址。可選
文檔
一個指向項目文檔的URL地址。可選
關鍵字
與包相關的關鍵字列表(最多5個)。可選
應用和排除
這是一個在最終包中會被應用的模式列表。
為了更好地打包,你可以顯式地指定poetry應該忽略或應用的一組globs。在排除字段中指定的globs會標識出一組文件,而這些文件在構建包時不會被包含在內。
如果一個包應用了VCS,那麽排除字段將被寫入到VCS的忽略文件(例如,git中的gitignore)。
依賴項和開發依賴項
在默認配置情況下,Poetry會去尋找PyPi上的依賴關系。在這時,只需要提供名稱和版本的字符串。
如果想使用私有存儲庫,你可以把它添加到pyproject.toml文件,如下所示:
請註意,必須要聲明與你的包兼容的python版本:
插入符號需求
插入符號需求允許對指定版本進行語義版本兼容性的更新。如果新版本號沒有修改主要的、次要的、補丁組中最左邊的數字,則會被允許更新。在這種情況下,如果我們運行poetry update requests,而且如果它是可用的,那麽poetry將會更新到版本2.14.0,但是不會更新到3.0.0。如果我們把版本字符串指定為^0.1.13,那麽詩歌就會更新到0.1.14,而不是0.2.0。一般認為0.0.x不會與其他任何版本兼容。
下面是一些關於插入符號需求的例子,以及它們可以使用的版本:
波浪符需求
波浪符需求會指定一個具有更新功能的最小版本。如果你指定了一個主要的、次要的和補丁的版本,或者只是一個主要的和次要的版本,那麽只允許進行補丁級別的更改。如果您只指定一個主要版本,那麽就允許進行次要的和補丁級別的更改。
~1.2.3是一個波浪符需求的例子。
通配符需求
通配符需求會允許使用任意已被通配符定位的版本。
*, 1.*和1.2.*是通配符需求的示例。
不等式需求
不等式需求允許手動指定依賴的版本範圍或一個確切的版本。
下面是不等式需求的一些例子:
多重需求
多個版本需求也可以用逗號分隔,例如:=1.2,<1.5。
git的依賴
為了依賴一個位於git存儲庫中的庫,你只需要指定一個帶有git鍵的存儲庫的位置:
由於我們沒有指定任何其他信息,所以Poetry假設我們打算使用主分支上的最新提交來構建我們的項目。您可以將git鍵與rev、tag或branch鍵組合在一起,用來指定其他東西。這裏有個例子,說明您想要使用一個名為next的分支上最新的提交:
Python限制的依賴
您還可以指定只針對特定的Python版本安裝的依賴項:
腳本
本節描述在安裝包時將要安裝的腳本或可執行文件
在安裝了一個帶有上述toml的包之後,poetry將在命令行中成為一個通用命令,它將等同於在poetry包中執行console.run命令。
附加項
Poetry通過額外的表達式來支持附加項:
l 可選的依賴項,它可以增強包的功能,但不是必需安裝的;
l 集群的可選依賴項。
在安裝包時,您可以通過使用-E|--extras附加選項來指定獲取額外功能:
插件
Poetry支持任何插件,它們的工作原理類似於setuptools的入口點。為了匹配setuptools文檔中的示例,您需要使用以下命令:
英文原文:https://github.com/sdispater/poetry
Python web 項目的依賴管理工具