PyPI 制品库

PyPI制品库用于存储和分发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>

配置推送凭据

::: tabs @tab 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"

@tab 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>

编译及推送制品

::: tabs @tab twine

python -m build  
twine upload -r cnb-pypi dist/*

@tab 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

推送制品

::: tabs @tab 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/*

@tab 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 中输入以下命令 ::: tabs @tab 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>

@tab 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>

编译及推送制品

::: tabs @tab twine

python -m build  
twine upload -r cnb-pypi dist/*

@tab 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 用法,请查阅官方文档

点评

点赞或评论
加载评论中...