極狐GitLab 是 GitLab 在中國的發行版,關于中文參考文檔和資料有:
- 極狐GitLab 中文文檔
- 極狐GitLab 中文論壇
- 極狐GitLab 官網
軟件包庫中的 PyPI 包 (BASIC ALL)
在項目的軟件包庫中發布 PyPI 包。然后在需要將它們用作依賴項時安裝它們。
軟件包庫適用于:
- pip
- twine
使用極狐GitLab 軟件包庫進行身份驗證
在您發布到極狐GitLab 軟件包倉庫之前,您必須進行認證。
要如此,您可以使用:
- 一個具有 api 范圍的個人訪問令牌。
- 一個具有 read_package_registry 或/和 write_package_registry 范圍的部署令牌。
- 一個 CI 作業令牌。
請勿使用此處文檔記錄的方法以外的其他身份驗證方法。 未記錄的身份驗證方法可能會在將來刪除。
TWINE_USERNAME
和 TWINE_PASSWORD
環境變量用于使用極狐GitLab 令牌進行身份驗證。
使用個人訪問令牌進行認證
要使用個人訪問令牌進行身份驗證,請更新 TWINE_USERNAME
和 TWINE_PASSWORD
環境變量:
image: python:latestrun:variables:TWINE_USERNAME: <your_personal_access_token_name>TWINE_PASSWORD: <your_personal_access_token>script:- pip install build twine- python -m build- python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*
使用部署令牌進行認證
要使用部署令牌進行身份驗證,請更新 TWINE_USERNAME
和 TWINE_PASSWORD
環境變量:
image: python:latestrun:variables:TWINE_USERNAME: <deploy token username>TWINE_PASSWORD: <deploy token>script:- pip install build twine- python -m build- python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*
使用 CI 作業令牌進行認證
要使用 CI 作業令牌進行身份驗證,請更新 TWINE_USERNAME
和 TWINE_PASSWORD
環境變量:
image: python:latestrun:variables:TWINE_USERNAME: gitlab-ci-tokenTWINE_PASSWORD: $CI_JOB_TOKENscript:- pip install build twine- python -m build- python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*
進行身份驗證以訪問某個群組內的軟件包
遵循上述的令牌類型指南,但使用群組 URL 代替項目 URL:
https://gitlab.example.com/api/v4/groups/<group_id>/-/packages/pypi
發布 PyPI 軟件包
先決條件:
-
您必須使用軟件包庫進行身份驗證。
-
您的版本字符串必須有效。
-
允許的最大包大小為 5 GB。
-
description
字段的最大長度為 4000 字符。更長的description
字符串會被截斷。 -
不能多次上傳同一版本的包。如果您嘗試,您會收到錯誤
400 Bad Request
。 -
使用您的 項目 ID 發布 PyPI 包。
-
如果您的項目在一個群組中,則發布到您的項目庫的 PyPI 包也可以在群組級庫中使用(請參閱從群組級別安裝)。
然后,您就可以使用 twine 發布 PyPI 包。
使用 twine 發布 PyPI 包
定義您的倉庫源,編輯 ~/.pypirc
文件并添加:
[distutils]
index-servers =gitlab[gitlab]
repository = https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi
要發布 PyPI 包,請運行類似的命令:
python3 -m twine upload --repository gitlab dist/*
如下消息預示著包已成功發布:
Uploading distributions to https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi
Uploading mypypipackage-0.0.1-py3-none-any.whl
100%|███████████████████████████████████████████████████████████████████████████████████████████| 4.58k/4.58k [00:00<00:00, 10.9kB/s]
Uploading mypypipackage-0.0.1.tar.gz
100%|███████████████████████████████████████████████████████████████████████████████████████████| 4.24k/4.24k [00:00<00:00, 11.0kB/s]
要查看已發布的軟件包,前往您項目的 軟件包與鏡像庫 頁面。
如果您沒有使用 .pypirc
文件來定義倉庫源,則可以使用內聯身份驗證發布到倉庫:
TWINE_PASSWORD=<personal_access_token or deploy_token or $CI_JOB_TOKEN> TWINE_USERNAME=<username or deploy_token_username or gitlab-ci-token> python3 -m twine upload --repository-url https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi dist/*
如果您沒有遵循此頁面上的步驟,請確保您的包已正確構建,并且您使用 setuptools
創建了一個 PyPI 包.
然后,您就可以使用如下的命令來上傳您的軟件包:
python -m twine upload --repository <source_name> dist/<package_file>
-
<package_file>
是您的軟件包文件名,以.tar.gz
或.whl
結尾。 -
<source_name>
是設置期間使用的源名稱。
發布具有相同名稱或版本的軟件包
如果具有相同名稱和版本的軟件包已經存在,則您無法發布軟件包。您必須先刪除現有的軟件包。如果您嘗試多次發布同一個軟件包,則會發生 400 Bad Request
錯誤。
安裝 PyPI 軟件包
當在軟件包倉庫中找不到 PyPI 軟件包時,請求轉發到 pypi.org。
管理員可以在持續集成設置中禁用此行為。
WARNING:當您使用 --index-url
選項時,不要指定默認端口,例如 80
以 http
開頭的 URL
,或 443
以 https
開頭的 URL。
從項目進行安裝
要安裝最新版本的軟件包,使用以下命令:
pip install --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple --no-deps <package_name>
-
<package_name>
是軟件包名稱。 -
<personal_access_token_name>
是具有read_api
范圍的個人訪問令牌名稱。 -
<personal_access_token>
是具有read_api
范圍的個人訪問令牌。 -
<project_id>
是項目的 URL 編碼路徑(例如:group%2Fproject
),或項目 ID(例如:42
)。
在這些命令中,您可以使用 --extra-index-url
代替 --index-url
。如果您遵循指南,并想要安裝 MyPyPiPackage
軟件包,您可以運行:
pip install mypypipackage --no-deps --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
如下信息顯示軟件包已成功安裝:
Looking in indexes: https://<personal_access_token_name>:****@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
Collecting mypypipackageDownloading https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/files/d53334205552a355fee8ca35a164512ef7334f33d309e60240d57073ee4386e6/mypypipackage-0.0.1-py3-none-any.whl (1.6 kB)
Installing collected packages: mypypipackage
Successfully installed mypypipackage-0.0.1
安全性影響
當安全 PyPI 時,使用 --extra-index-url
或 --index-url
時,安全性影響很大,值得深入了解。如果您在使用:
-
--index-url
:此選項會替換具有指定 URL 的 PyPI 索引。它是更安全的,因為它僅檢查指定索引中的包。在您想確保僅從信任的私人源安裝包時使用此選項。 -
--extra-index-url
:此選項會將附加索引添加到默認的 PyPI 索引。它是不安全的,因為它會檢查默認的 PyPI 索引和附加索引中的包,因此會導致依賴混淆攻擊。
從群組安裝
要從群組安裝最新版本的軟件包,使用以下命令:
pip install --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/groups/<group_id>/-/packages/pypi/simple --no-deps <package_name>
在此命令中:
-
<package_name>
是軟件包名稱。 -
<personal_access_token_name>
是具有read_api
范圍的個人訪問令牌名稱。 -
<personal_access_token>
是具有read_api
范圍的個人訪問令牌。 -
<group_id>
是群組 ID。
在這些命令中,您可以使用 --extra-index-url
代替 --index-url
。然而,使用 --extra-index-url
會使您受到依賴混淆攻擊的影響,因為它會在檢查自定義倉庫之前檢查 PyPi 倉庫中的包。 --extra-index-url
添加了提供的 URL 作為額外的倉庫,客戶端將檢查它是否存在包。 --index-url
告訴客戶端僅在提供的 URL 中檢查包。
如果您遵循指南,并且想要安裝 MyPyPiPackage
軟件包,您可以運行:
pip install mypypipackage --no-deps --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/groups/<your_group_id>/-/packages/pypi/simple
軟件包名稱
極狐GitLab 查找使用 PEP-503 標準化名稱的軟件包。-
、_
和 .
都被視為相同,并且重復的字符會被刪除。
針對 my.package
的 pip install
請求會查找匹配任何三個字符的包,例如 my-package
、my_package
和 my....package
。
使用 requirements.txt
如果您想 pip 能夠訪問您的公共倉庫,請將 --extra-index-url
參數與您的倉庫 URL 一起添加到您的 requirements.txt
文件中。
--extra-index-url https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple
package-name==1.0.0
如果這是私有倉庫,您可以使用以下方式進行身份驗證:
- 使用您的
requirements.txt
文件:
--extra-index-url https://__token__:<your_personal_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple
package-name==1.0.0
- 使用
~/.netrc
文件:
machine gitlab.example.com
login __token__
password <your_personal_token>
版本化 PyPI 軟件包
正確的版本化對高效管理 PyPI 軟件包是非常重要的。遵循這些最佳實踐以確保您的軟件包能夠正確版本化。
使用語義化版本號(SemVer)
為您的軟件包采用語義化版本號(SemVer)。版本號應使用格式 MAJOR.MINOR.PATCH
:
- 為不兼容的 API 變更,增加
MAJOR
版本號。 - 為向后兼容的新功能,增加
MINOR
版本號。 - 為向后兼容的 bug 修復,增加
PATCH
版本號。
比如,1.0.0、1.1.0、1.1.1。
從 0.1.0 開始
對于新項目,從 0.1.0 開始。這表示初始開發階段,API 還未穩定。
使用有效的版本設置
確保您的版本字符串符合 PyPI 標準。極狐GitLab 使用特定的正則表達式來驗證版本字符串:
\A(?:v?(?:([0-9]+)!)? (?# epoch)([0-9]+(?:\.[0-9]+)*) (?# release segment)([-_\.]?((a|b|c|rc|alpha|beta|pre|preview))[-_\.]?([0-9]+)?)? (?# pre-release)((?:-([0-9]+))|(?:[-_\.]?(post|rev|r)[-_\.]?([0-9]+)?))? (?# post release)([-_\.]?(dev)[-_\.]?([0-9]+)?)? (?# dev release)(?:\+([a-z0-9]+(?:[-_\.][a-z0-9]+)*))? (?# local version)
)\z}xi
故障排查
為了改善性能,pip 命令會緩存與軟件包相關的文件。Pip 不自行刪除數據。緩存會隨著新軟件包的安裝而增長。如果您遇到問題,請使用此命令清除緩存:
pip cache purge
多個 index-url
或 extra-index-url
參數
您可以定義多個 index-url
和 extra-index-url
參數。
如果您使用令牌認證多次使用了相同的域名名稱(例如:gitlab.example.com
),pip
可能無法找到您的軟件包。這個問題是由在命令執行期間 pip
注冊和存儲令牌導致。
為解決此問題,你可以使用一個群組部署令牌,該令牌來自所有作為 index-url
和 extra-index-url
值所指向目標的項目或群組的共同父群組,且其權限范圍為 read_package_registry
。
要解決此問題,您可以
支持的 CLI 命令
極狐GitLab PyPI 倉庫支持如下 CLI 命令:
-
twine upload
: 將軟件包上傳到倉庫。 -
pip install
: 從倉庫安裝 PyPI 軟件包。