如何使用 Nexus Repository 配置 PyPI 包管理

Overview

Python 包索引(Python Package Index,简称 PyPI)是由全球 Python 开发者社区提供的庞大开源 Python 包仓库。官方索引地址为 https://pypi.org,该网站由 Python Software Foundation 维护。

Nexus Repository 支持代理 Python 包索引。通过利用官方 Python 包索引中的包资源,避免重复下载,从而减少访问 Python 包时的时间和带宽消耗。

此外,您还可以将自己的包发布到私有索引作为托管仓库,并将远程和私有仓库暴露为仓库组,以一个便捷的 URL 合并并暴露多个仓库的内容。

仓库类型概述

PyPI Proxy - 作为远程 PyPI 仓库(如 https://pypi.org)的代理,缓存包以实现更快访问和减少带宽使用。当请求包时,先检查本地缓存,若未命中则从远程仓库下载并缓存。

PyPI Hosted - 存储直接上传到 Nexus 实例的包,通常用于私有包、内部库或需要完全控制的包。

PyPI Group - 将多个 PyPI 仓库(代理、托管或其他组)合并为单一逻辑仓库。当从组中请求包时,Nexus 按指定顺序搜索成员仓库直到找到包。注意:PyPI Group 仓库仅用于下载 PyPI 包,不用于部署 PyPI 包。

典型架构

常见配置包括:

  1. PyPI Hosted - 用于私有/内部包
  2. PyPI Proxy - 用于缓存来自 PyPI.org 的公共包
  3. PyPI Group - 合并托管和代理仓库,提供统一访问入口

该架构允许客户端使用单一仓库 URL 无缝访问私有和公共包。

前提条件

  • 已部署 Nexus 实例并使用管理员账号登录。
  • 本地已安装 Python 环境及 pip 包管理工具。

创建 PyPI Proxy 仓库

若要使用 PyPI Proxy 缓存 PyPI 包,需要创建 PyPI Proxy 仓库。注意:Nexus 实例应能访问互联网。

在 Nexus 界面操作:

  1. 点击 SettingsRepositoriesCreate repositoryPyPI (proxy)
  2. 填写配置详情,点击 Create repository

配置参数:

  • Name:输入仓库名称,例如 pypi-proxy
  • Remote storage:输入远程仓库 URL,例如 https://pypi.org
  • Storage:根据需求选择合适的存储类型

创建 PyPI Hosted 仓库

若要使用 PyPI Hosted 存储 PyPI 包,需要创建 PyPI Hosted 仓库。

在 Nexus 界面操作:

  1. 点击 SettingsRepositoriesCreate repositoryPyPI (hosted)
  2. 填写配置详情,点击 Create repository

配置参数:

  • Name:输入仓库名称,例如 pypi-hosted
  • Storage:根据需求选择合适的存储类型
  • Deployment policy:根据需求选择 Allow redeployDisable redeploy

创建 PyPI Group 仓库

在 Nexus 界面操作:

  1. 点击 SettingsRepositoriesCreate repositoryPyPI (group)
  2. 填写配置详情,点击 Create repository

配置参数:

  • Name:输入仓库名称,例如 pypi-group
  • Member repositories:选择之前创建的 pypi-proxypypi-hosted 仓库
  • Order:根据需求配置仓库搜索顺序

使用 Nexus 仓库与 Python 客户端

在进行以下场景操作前,可从 Nexus Web 界面获取仓库 URL。点击 Browse,选择已创建的仓库,点击 Copy 按钮获取仓库 URL。该 URL 将用于以下配置示例。

场景 1:使用 twine 上传到托管仓库

此场景演示如何使用 PyPI Hosted 仓库部署并发布自有 Python 包,适用于:

  • 私有包:内部库和应用,不希望发布到公共 PyPI
  • 自定义构建:带有特定配置的公共包修改版本
  • 专有软件:需要受控分发的商业或机密包
  • 开发包:用于内部测试和验证的预发布版本

流程包括构建 Python 包、配置部署目标,并上传包到 Nexus PyPI Hosted 仓库。

# 安装最新版本的 PyPA 的 build 和 twine 工具
$ python3 -m pip install --upgrade build twine

# 克隆示例项目,也可使用自己的项目
$ git clone https://github.com/pypa/sampleproject.git
$ cd sampleproject
# 构建包
$ python3 -m build
....
adding 'test_pypi_demo_mac_2025-0.1.0.dist-info/RECORD'
removing build/bdist.macosx-10.13-universal2/wheel
Successfully built test_pypi_demo_mac_2025-0.1.0.tar.gz and test_pypi_demo_mac_2025-0.1.0-py3-none-any.whl

# 将 PyPI Hosted 仓库 URL 添加到用户级配置,更多信息请参考 [PyPI Configuration](https://packaging.python.org/en/latest/specifications/pypirc/#pypirc)
# distutils 部分定义了 index-servers 字段,列出所有描述仓库的部分名称。
$ cat <<EOF > ~/.pypirc
[distutils]
index-servers = nexus

[nexus]
repository = https://your-nexus-server.com/repository/pypi-hosted/
username = username
password = password
EOF

# 上传 PyPI 包
$ python3 -m twine upload --repository nexus dist/*
Uploading distributions to http://your-nexus-server.com/repository/pypi-host/
Uploading test_pypi_demo_mac_2025-0.1.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.9/12.9 kB 00:00 ?
Uploading test_pypi_demo_mac_2025-0.1.0.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.9/13.9 kB 00:00 ?

成功上传包到 PyPI Hosted 仓库后,可通过 Nexus Web 界面查看和管理:Browse选择 PyPI Hosted 仓库Browse Package Contents

场景 2:使用 pip 从 PyPI Group 仓库下载和安装包

此场景演示如何配置 pip 使用 PyPI Group 仓库管理 Python 包依赖,适用于:

  • 统一包访问:使用单一仓库 URL 访问公共包(通过代理)和私有包(通过托管)
  • 性能优化:本地缓存常用包,减少下载时间和带宽消耗
  • 集中管理:所有包依赖通过单一 Nexus 实例管理
  • 安全控制:集中认证和访问控制包下载

流程包括配置 pip 使用 PyPI Group 仓库 URL,自动搜索成员仓库查找并下载所需包。

配置 pip 匿名访问

# 将 PyPI Group 仓库 URL 添加到用户级配置
# 若 Nexus 服务器无有效或无 HTTPS 证书,可添加 trusted-host 参数
$ mkdir -p ~/.pip
$ cat <<EOF > ~/.pip/pip.conf
[global]
index-url = https://your-nexus-server.com/repository/pypi-group/simple/
timeout = 15

[install]
trusted-host = your-nexus-server.com 
EOF

# 安装 PyPI 包
$ pip3 install requests
Looking in indexes: https://your-nexus-server.com/repository/python/simple/
...
Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages (from requests) (2025.8.3)

配置 pip 认证访问

若 Nexus 禁用匿名访问,需要在 pip.conf 文件中添加用户名和密码:

# 将 PyPI Group 仓库 URL 添加到用户级配置
# 若 Nexus 服务器无有效或无 HTTPS 证书,可添加 trusted-host 参数
$ mkdir -p ~/.pip
$ cat <<EOF > ~/.pip/pip.conf
[global]
index-url = https://username:password@your-nexus-server.com/repository/pypi-group/simple/
timeout = 15

[install]
trusted-host = your-nexus-server.com
EOF

# 安装 PyPI 包
$ pip3 install requests
Looking in indexes: https://admin:****@your-nexus-server.com/repository/python/simple/
...
Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages (from requests) (2025.8.3)

配置注意事项

  • 密码中的特殊字符必须进行 URL 编码(例如 @ 变为 %40
  • 注意存储明文凭据的安全风险
  • 仓库 URL 必须始终以 /simple/ 结尾
  • 若 Nexus 使用不安全连接或不受信任证书,需配置 trusted-host 参数