1. 程式人生 > >Python web 項目的依賴管理工具

Python web 項目的依賴管理工具

符號 默認 ont 獲得 全功能 插件 生成 用戶 分析

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 項目的依賴管理工具