存放庫
存放庫 #
Poetry 支援使用 PyPI 和個人存放庫來找出套件,以及發布您的專案。
預設情況下,Poetry 會設定使用 PyPI 存放庫,來安裝套件和發布專案。
因此,當您新增依賴項到專案中時,Poetry 會假設這些依賴項可在 PyPI 中取得。
這應用了大部分情況,且對於大多數使用者來說已足夠。
私人存放庫範例 #
從私人套件來源進行安裝 #
預設情況下,Poetry 會從 PyPI 中找出並安裝套件。但是,您想要為您的專案安裝一個依賴項,以便進行 簡易 API 存放庫 ?讓我們來做做看。
首先,將 設定 套件來源 為專案的 補充 (或 明確) 套件來源。
poetry source add --priority=supplemental foo https://pypi.example.org/simple/
接著,假設存放庫需要驗證,請設定憑證。
poetry config http-basic.foo <username> <password>
如果您想互動式地提供密碼,您只要在命令中省略 <密碼>
。然後,Poetry 將提示您手動輸入憑證。
poetry config http-basic.foo <username>
這樣做完後,您就可以從這個來源新增依賴項到您的專案中。
poetry add --source foo private-package
發布到私人存放庫 #
太棒了,現在剩下的就是發布您的套件了。假設您希望私下與團隊成員分享,您可以設定 Upload API 端點,以作為您的 可發布的儲存庫。
poetry config repositories.foo https://pypi.example.org/legacy/
如果您需要為您的 套件來源 使用不同的憑證,建議您使用不同的名稱作為您的發布儲存庫。
poetry config repositories.foo-pub https://pypi.example.org/legacy/
poetry config http-basic.foo-pub <username> <password>
當使用環境變數設定儲存庫時,請注意必須使用正確的字尾。
export POETRY_REPOSITORIES_FOO_URL=https://pypi.example.org/legacy/
export POETRY_HTTP_BASIC_FOO_USERNAME=<username>
export POETRY_HTTP_BASIC_FOO_PASSWORD=<password>
現在,剩下的就是使用 publish
來建置並發布您的專案。
poetry publish --build --repository foo-pub
套件來源 #
預設情況下,Poetry 會設定為使用 Python 生態系統的標準套件索引 PyPI。
專案組態 #
這些套件來源可以使用 source
指令在您的專案中進行管理。
poetry source add foo https://foo.bar/simple/
這會在您的 pyproject.toml
檔案中產生下列組態程式碼片段。
[[tool.poetry.source]]
name = "foo"
url = "https://foo.bar/simple/"
priority = "primary"
如果 priority
未定義,來源會被視為比 PyPI、次要、補充和明確來源優先的來源。
套件來源會依據下列順序優先考量
在每個優先順序類別中,套件來源的優先考量順序為出現在 pyproject.toml
中的順序。
預設套件來源(已不建議使用)#
在 1.8.0 中已不建議使用
預設情況下,如果你尚未組態任何主來源,Poetry 會將 PyPI 組態為專案的套件來源。你可以變更此行為,並只從已組態的套件來源中查看套件,方法是新增至少一個主來源(建議)或使用 priority = "default"
(已不建議)的單一來源。
poetry source add --priority=default foo https://foo.bar/simple/
主套件來源 #
會在每個沒有 來源約束 的依賴項中搜尋所有主套件來源。如果你組態至少一個主來源,則隱含的 PyPI 來源會停用。
poetry source add --priority=primary foo https://foo.bar/simple/
沒有優先順位的來源也會視為主來源。
poetry source add foo https://foo.bar/simple/
如果已組態至少一個主來源,則會自動停用隱含的 PyPI 來源。如果你想要除了主來源之外再使用 PyPI,請使用特定的優先順序明確地組態它,例如
poetry source add --priority=primary PyPI
這樣,就能以細緻的方式設定 PyPI 的優先順序。
pyproject.toml
中的等效規格是
[[tool.poetry.source]]
name = "pypi"
priority = "primary"
明確指定 PyPI 時,省略 url
。由於 PyPI 在 Poetry 中是內部組態,因此無法透過指定的 URL 組態 PyPI 存放庫。請記住,你隨時可以使用 poetry check
來確保 pyproject.toml
檔案有效。
次要套件來源(已不建議) #
已在 1.5.0 中不建議使用
如果套件來源組態為次要,則表示在選擇也存在於你的預設和主套件來源中相容套件發行版時,它們會被給予較低的優先順序。如果你希望僅在優先順序較高的存放庫未傳回結果時才搜尋套件來源,請改考慮 補充來源。
你可以在套件來源組態中使用 priority = "secondary"
,將套件來源組態為次要來源。
poetry source add --priority=secondary foo https://foo.bar/simple/
次要套件來源可以有一個以上。
補充套件來源 #
已在 1.5.0 中引入
組態為補充的套件來源只有在沒有其他(優先順序較高)來源產生相容套件發行版時才會被搜尋。如果來源的回應時間很長,而且需要從此來源擷取相對較少的套件發行版,這會特別方便。
你可以在套件來源組態中使用 priority = "supplemental"
,將套件來源組態為補充來源。
poetry source add --priority=supplemental foo https://foo.bar/simple/
補充套件來源可以有一個以上。
明確的套件來源 #
已在 1.5.0 中引入
如果套件來源被設定為明確的,則唯有當套件配置明確地指出應該在這個套件來源上找到套件時,才會搜尋這些來源。
你可以使用套件來源配置中 priority = "explicit"
來設定套件來源為明確來源。
poetry source add --priority=explicit foo https://foo.bar/simple/
明確的套件來源可以超過一個。
一個明確的套件來源在現實世界中會派上用場的範例,就是 PyTorch GPU 套件。
poetry source add --priority=explicit pytorch-gpu-src https://download.pytorch.org/whl/cu118
poetry add --source pytorch-gpu-src torch torchvision torchaudio
套件來源限制 #
在套件查找程序期間,將會搜尋所有套件來源(包括次要和平補來源)。無論是在一個或多個來源找到套件,都會對所有來源傳送這些網路要求。
為了將特定套件的搜尋範圍限制在某個套件儲存庫,你可以明確地指定來源。
poetry add --source internal-pypi httpx
這會在 pyproject.toml
中產生下列設定
[tool.poetry.dependencies]
...
httpx = { version = "^0.22", source = "internal-pypi" }
[[tool.poetry.source]]
name = "internal-pypi"
url = ...
priority = ...
"explicit"
。如果某個儲存庫被設定為套件的來源,它將是該套件被考量的唯一來源,而儲存庫的優先權將不會對解析產生影響。套件 source
金鑰不會被其相依性繼承。特別地,如果 package-A
被設定為在 source = internal-pypi
中找到,而 package-A
相依於 package-B
(它也應該在 internal-pypi
中找到),那麼 package-B
需要在 pyproject.toml
中被設定為這樣。實現這個目的的最簡單方法是使用萬用字元限制來新增 package-B
poetry add --source internal-pypi package-B@*
這將確保 package-B
只會在 internal-pypi
套件來源中被搜尋。在 package-B
的版本限制通常會從 package-A
(和其他用戶端套件)衍生而來。
如果你想要避免附加的主要相依性,你可以將 package-B
新增到一個專用的相依性群組
poetry add --group explicit --source internal-pypi package-B@*
支援的套件來源 #
Python 套件索引 (PyPI) #
Poetry 透過其 JSON API 與 PyPI 互動。這會用來擷取所要求封裝的版本、資料、檔案等。
如果要從 PyPI 明確選擇封裝,可以使用 add
指令的 --source
選項,如下所示。
poetry add --source pypi httpx@^0.22.0
這會在你的 pyproject.toml
檔案產生下列設定片段。
httpx = {version = "^0.22.0", source = "pypi"}
priority = "default"
,隱含的 pypi
來源會停用且不用於任何封裝。簡易 API 儲存庫 #
Poetry 可以從公共或私人自訂儲存庫擷取和安裝封裝相依性,這些儲存庫實現簡易儲存庫 API,如 PEP 503 中所述。
這些封裝來源可以在你的專案中透過下列指令設定。
poetry source add testpypi https://test.pypi.org/simple/
/simple/
。在設定與 PEP 503 相符的封裝來源時,這很重要。除了 PEP 503 之外,Poetry 也可以處理實作 PEP 658 的簡易 API 儲存庫(自 1.2.0 版引入)。這可協助減少來自這些來源的封裝的相依性解析時間,因為 Poetry 可以免去下載各候選配送以確定相關資料的必要性。
如果沒有可用的資料,為何 Poetry 堅持為所有平台下載所有候選配送?
需要這樣做的原因在於 Poetry 的鎖定檔與平台無關。這表示,為了替專案解析相依性,Poetry 需要所有特定平台配送的資料。而當此資料並非隨時可得,下載配送並在本地檢查它就是唯一的方法。
單一頁面連結來源 #
自 1.2.0 版引入
有些專案選擇透過單一頁面連結來源釋出其二進位配送,此來源部分遵循 PEP 503 中封裝頁面的結構。
這些封裝來源可以在你的專案中透過下列指令設定。
poetry source add jax https://storage.googleapis.com/jax-releases/jax_releases.html
可發布的儲存庫 #
與套件來源不同,Poetry 將您發布套件的儲存庫視為針對使用者而非針對專案的特定設定。詩集目前僅支援舊版上傳 API,供您發布專案。
這些設定透過config
指令,在repositories
金鑰下進行設定。
poetry config repositories.testpypi https://test.pypi.org/legacy/
設定憑證 #
如果您想要儲存針對特定儲存庫的憑證,您可以輕鬆地執行此動作
poetry config http-basic.foo <username> <password>
如果您沒有指定密碼,系統會提示您輸入密碼。
若要發布至 PyPI,您可以設定名為 pypi
的儲存庫憑證。
請注意,建議在將套件上傳至 PyPI 時使用API 權杖。一旦您建立新的權杖,您可以通知 Poetry 使用該權杖
poetry config pypi-token.pypi <my-token>
如果您已將 testpypi 設定為可發布儲存庫,可以使用以下方式設定此權杖
poetry config pypi-token.testpypi <your-token>
如果您仍然想要使用您的使用者名稱和密碼,您可以透過以下呼叫 config
來執行此動作。
poetry config http-basic.pypi <username> <password>
您也可以在使用 publish
指令時,透過 --username
和 --password
選項指定使用者名稱和密碼。
如果系統提供並支援金鑰圈,就會將密碼儲存至金鑰圈中,並從中擷取密碼。在上方的範例中,將使用 poetry-repository-pypi
這個名稱儲存憑證。如果無法存取金鑰圈或不受支援,就會回朔至將密碼連同使用者名稱寫入 auth.toml
檔案中。
透過使用keyring 函式庫啟用金鑰圈支援。若要瞭解支援的後端詳細資訊,請參閱函式庫文件。
如果您不想使用金鑰圈,您可以通知 Poetry 將其停用,並將憑證儲存在純文字設定檔中
poetry config keyring.enabled false
或者,您可以使用環境變數來提供憑證
export POETRY_PYPI_TOKEN_FOO=my-token
export POETRY_HTTP_BASIC_FOO_USERNAME=<username>
export POETRY_HTTP_BASIC_FOO_PASSWORD=<password>
其中 FOO
是儲存庫名稱,且以大寫表示 (例如 PYPI
)。請參閱使用環境變數,以取得如何使用環境變數設定 Poetry 的詳細資訊。
如果您的密碼以破折號開頭(例如 CI 環境中的隨機產生衍生字元),它會被剖析成命令列選項而不是密碼。您可以透過新增雙破折號來防止此情況,以防止任何後續參數被剖析成選項。
poetry config -- http-basic.pypi myUsername -myPasswordStartingWithDash
憑證 #
自訂憑證授權機構和雙向 TLS 驗證 #
Poetry 支援使用自訂憑證授權機構來保護儲存庫,以及需要基於憑證的用戶端驗證的儲存庫。下列將配置「foo」儲存庫,使用自訂憑證授權機構來驗證儲存庫的憑證,並使用用戶端憑證(注意,這些設定變數不都需要設定)。
poetry config certificates.foo.cert /path/to/ca.pem
poetry config certificates.foo.client-cert /path/to/client.pem
如果需要略過憑證驗證,certificates.<repository>.cert
的值可以設定為 false
。這對於使用自簽署憑證的封裝來源是有用的。
poetry config certificates.foo.cert false
快取 #
Poetry 使用封裝來源的許多快取,以便改善使用者體驗並避免重複的網路要求。
第一層快取是 Cache-Control 標頭快取,適用於幾乎所有的 HTTP 要求。
此外,每個透過 HTTP 備份的封裝來源,都會在取得或產生封裝後快取與封裝相關的資料。此外,已下載的檔案(封裝發行)也會快取。
除錯問題 #
如果您在封裝來源遇到問題,最簡單的除錯步驟之一,就是重新執行您的指令,加上 --no-cache
旗標。
poetry --no-cache add pycowsay
如果這解決您的問題,您可以考慮使用 cache
指令來清除您的快取。
或者,您也可以考慮啟用詳細記錄 -vvv
,並加上 --no-cache
,以在記錄中看到發出的網路要求。