PyPI 制品库
1622 字约 5 分钟
PyPI 制品库是用于存储和分发 Python 软件包的仓库,开发者可以通过它上传、管理和安装各种 Python 第三方库和工具
创建制品库
参考 创建制品库
获取制品库地址
参考 获取制品库的地址
创建令牌
云原生构建平台的所有资源(包括代码仓库、制品库、OPENAPI等),都需要通过访问令牌进行操作。 创建令牌
本地开发
配置拉取凭据
- 方案1: 在 ~/.pip/pip.conf(MacOS/Linux) 或者 %HOME%\pip\pip.ini(Windows) 中添加 pip 源配置
[global]
# TOKEN: 访问令牌的 password; REPO_URL: 制品库地址
# 示例: index-url = https://cnb:29bGg84xqRf3ZweNpYlL92e7tDv@pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
index-url = https://cnb:<TOKEN>@<REPO_URL>
- 方案2: 您也可以使用命令行设置
# TOKEN: 访问令牌的 password; REPO_URL: 制品库地址
# 示例: pip config set global.index-url https://cnb:29bGg84xqRf3ZweNpYlL92e7tDv@pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
pip config set global.index-url https://cnb:<TOKEN>@<REPO_URL>
配置推送凭据
twine 配置
请在 ~/.pypirc 文件中添加以下配置
[distutils]
index-servers =
coding-pypi
[coding-pypi]
# 制品库地址
repository: <REPO_URL>
username: cnb
# 访问令牌的 password
password: <TOKEN>
示例:
[distutils]
index-servers =
coding-pypi
[coding-pypi]
repository: https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
username: cnb
password: "29bGg84xqRf3ZweNpYlL92e7tDv"
poetry 配置
运行以下命令
poetry config http-basic.cnb-pypi cnb <TOKEN> # 访问令牌的 password
poetry config repositories.cnb-pypi <REPO_URL> # 制品库地址
示例:
poetry config http-basic.cnb-pypi cnb 29bGg84xqRf3ZweNpYlL92e7tDv
poetry config repositories.cnb-pypi https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
拉取制品
#示例1: pip install requests
#示例2: 拉取指定版本 pip install requests==2.30.1
pip install <PACKAGE_NAME>
# 示例,临时源拉取 pip install -i https://cnb:29bGg84xqRf3ZweNpYlL92e7tDv@pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple requests
pip install -i https://cnb:<TOKEN>@<REPO_URL> <PACKAGE_NAME>
编译及推送制品
twine
python -m build
twine upload -r cnb-pypi dist/*
poetry
poetry build
poetry publish -r cnb-pypi
云原生构建
拉取制品
- 方案1: 使用内置的 CNB_TOKEN 环境变量:
main:
push:
- docker:
image: docker.cnb.cool/examples/language/python-3:latest
stages:
- name: 拉取制品
script:
# 制品库地址
# 示例: pip config set global.index-url https://cnb:${CNB_TOKEN}@pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
- pip config set global.index-url https://cnb:${CNB_TOKEN}@<REPO_URL>
# 示例: pip install requests
- pip install <PACKAGE_NAME>
- 方案2: 使用密钥仓库文件:
main:
push:
- docker:
image: docker.cnb.cool/examples/language/python-3:latest
imports:
# 引入密钥仓库配置文件
- <SECRET_REPO_URL>
stages:
- name: 拉取制品
script:
- pip config set global.index-url https://<USER_NAME>:<PASS_WORD>@<REPO_URL>
- pip install <PACKAGE_NAME>
示例:
main:
push:
- docker:
image: docker.cnb.cool/examples/language/python-3:latest
imports:
- https://cnb.cool/cnb-demo/env-demo/-/blob/main/envs/env.yml
stages:
- name: 拉取制品
script:
# 引入密钥仓库配置文件,以环境变量的形式注入 USER_NAME 和 PASS_WORD 的值
- pip config set global.index-url https://${USER_NAME}:${PASS_WORD}@pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
- pip install requests
推送制品
twine 配置
- 方案1: 使用内置的 CNB_TOKEN 环境变量:
main:
push:
- docker:
image: docker.cnb.cool/examples/language/python-3:latest
stages:
- name: 打包 & 上传至仓库
script:
- export TWINE_USERNAME="cnb"
- export TWINE_PASSWORD=${CNB_TOKEN}
# 制品库地址
# 示例: export TWINE_REPOSITORY_URL=https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
- export TWINE_REPOSITORY_URL=<REPO_URL>
- python -m build
- twine upload dist/*
- 方案2: 使用密钥仓库文件
main:
push:
- docker:
image: docker.cnb.cool/examples/language/python-3:latest
imports:
# 密钥仓库文件地址
# 示例: https://cnb.cool/cnb-demo/env-demo/-/blob/main/envs/env.yml
- <SECRET_REPO_URL>
stages:
- name: 打包 & 上传至仓库
script:
# 密钥仓库文件 USER_NAME 配置
- export TWINE_USERNAME=${USER_NAME}
# 密钥仓库文件 PASS_WORD 配置
- export TWINE_PASSWORD=${PASS_WORD}
# 制品库地址
# 示例: export TWINE_REPOSITORY_URL=https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
- export TWINE_REPOSITORY_URL=<REPO_URL>
- python -m build
- twine upload dist/*
poetry 配置
- 方案1: 使用内置的 CNB_TOKEN 环境变量:
main:
push:
- docker:
image: docker.cnb.cool/examples/language/python-3:latest
stages:
- name: 打包 & 上传至仓库
script:
- export POETRY_HTTP_BASIC_CNB_PYPI_USERNAME="cnb"
- export POETRY_HTTP_BASIC_CNB_PYPI_PASSWORD=${CNB_TOKEN}
# 制品库地址
# 示例: poetry config repositories.cnb-pypi https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
- poetry config repositories.cnb-pypi <REPO_URL>
- poetry build
- poetry publish -r cnb-pypi
- 方案2: 使用密钥仓库文件:
main:
push:
- docker:
image: docker.cnb.cool/examples/language/python-3:latest
imports:
# 密钥仓库文件地址, 示例 https://cnb.cool/cnb-demo/env-demo/-/blob/main/envs/env.yml
- <SECRET_REPO_URL>
stages:
- name: 打包 & 上传至仓库
script:
# 密钥仓库文件 USER_NAME 配置
- export POETRY_HTTP_BASIC_CNB_PYPI_USERNAME=${USER_NAME}
# 密钥仓库文件 PASS_WORD 配置
- export POETRY_HTTP_BASIC_CNB_PYPI_PASSWORD=${PASS_WORD}
# 制品库地址
# 示例: poetry config repositories.cnb-pypi https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
- poetry config repositories.cnb-pypi <REPO_URL>
- poetry build
- poetry publish -r cnb-pypi
云原生开发
前置准备工作
请在 .cnb.yml 文件中添加以下配置
$:
vscode:
- docker:
image: docker.cnb.cool/examples/language/python-3:latest
services:
- vscode
- docker
# 使用密钥仓库文件则需要填入以下配置
imports:
# 示例: https://cnb.cool/cnb-demo/env-demo/-/blob/main/envs/env.yml
- <SECRET_REPO_URL>
配置拉取凭据
- 方案1: 使用内置的 CNB_TOKEN 环境变量:
# 示例: pip config set global.index-url https://cnb:${CNB_TOKEN}@pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
pip config set global.index-url https://cnb:${CNB_TOKEN}@<REPO_URL>
- 方案2: 使用密钥仓库文件:
# 示例: pip config set global.index-url https://${USER_NAME}:${PASS_WORD}@pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
pip config set global.index-url https://${USER_NAME}:${PASS_WORD}@<REPO_URL>
配置推送凭据
云原生开发 TERMINAL 中输入以下命令
twine
- 方案1: 使用内置的 CNB_TOKEN 环境变量:
export TWINE_USERNAME="cnb"
export TWINE_PASSWORD="${CNB_TOKEN}"
# 制品库地址
# 示例: export TWINE_REPOSITORY_URL=https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
export TWINE_REPOSITORY_URL=<REPO_URL>
- 方案2: 使用密钥仓库文件:
# 密钥仓库文件 USER_NAME 配置
export TWINE_USERNAME="${USER_NAME}"
# 密钥仓库文件 PASS_WORD 配置
export TWINE_PASSWORD="${PASS_WORD}"
# 制品库地址
# 示例: export TWINE_REPOSITORY_URL=https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
export TWINE_REPOSITORY_URL=<REPO_URL>
poetry
- 方案1: 使用内置的 CNB_TOKEN 环境变量:
export POETRY_HTTP_BASIC_CNB_PYPI_USERNAME="cnb"
export POETRY_HTTP_BASIC_CNB_PYPI_PASSWORD="${CNB_TOKEN}"
# 制品库地址
# 示例: poetry config repositories.cnb-pypi https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
poetry config repositories.cnb-pypi <REPO_URL>
- 方案2: 使用密钥仓库文件:
# 密钥仓库文件 USER_NAME 配置
export POETRY_HTTP_BASIC_CNB_PYPI_USERNAME="${USER_NAME}"
# 密钥仓库文件 PASS_WORD 配置
export POETRY_HTTP_BASIC_CNB_PYPI_PASSWORD="${PASS_WORD}"
# 制品库地址
# 示例 poetry config repositories.cnb-pypi https://pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple
poetry config repositories.cnb-pypi <REPO_URL>
拉取制品
#示例1: pip install requests
#示例2: 拉取指定版本 pip install requests==2.30.1
pip install <PACKAGE_NAME>
# 示例: 临时源拉取 pip install -i https://cnb:${CNB_TOKEN}@pypi.cnb.cool/cnb-demo/pypi-demo/-/packages/simple requests
pip install -i https://cnb:${CNB_TOKEN}@<REPO_URL> <PACKAGE_NAME>
编译及推送制品
twine
python -m build
twine upload -r cnb-pypi dist/*
poetry
poetry build
poetry publish -r cnb-pypi
FAQ
Q:为什么我上传时会报 409 的错误
A: 您上传的制品包名称和版本已经存在,请将您制品仓库的版本覆盖策略
设置为允许覆盖已有版本
,或者更改当前包的版本,再上传即可
Q:为什么我上传时会报 400 的错误
A: 这种情况一般是您的制品文件名不符合 PyPI 制品的规范,请您检查并处理后再进行上传操作
Q:CNB PyPI 制品仓库目前支持哪些 PyPI 制品格式
A: 我们目前仅支持 wheel 和 sdist 两种类型的制品包,对于诸如 egg 或者 exe 等比较旧的制品格式,我们会拒绝上传
更多用法
更多 PyPI 用法,请查阅官方文档