跳转至

使用 nexus3 配置 python 私有仓库

(一)创建 Repository

1. 创建 Blob Store

创建 python-devops 创建 python-devops
image-20250911144939445 image-20250911144535448

2. 创建 hosted 类型的 pypi。

在企业开发中,会开发很多内部使用的库,比如自定义的工具类库、业务组件库等。这些内部私有依赖不会发布到公共的 pypi 中央仓库。通过创建 hosted 类型的pypi 仓库,可以将这些内部私有依赖存储在内部仓库中,方便团队内的项目引用。这样,团队成员在构建项目时,pypi 就能从这个内部仓库获取所需的私有依赖,而不需要通过其他复杂的方式来共享和管理这些依赖。

"点击 Repository -- Repositories -- Create repository -– pypi(hosted) "

image-20250912105924877 image-20250912112327525
配置项 操作 / 说明
Name 填写 pypi-local,用于自定义仓库标识,方便后续管理区分。
Online 勾选,控制仓库是否处于可访问状态,勾选后 pypi 能正常与该仓库交互,取消则进入离线模式。
Storage - Blob store 下拉选择此前创建的专用 blob 存储 pypi-local,实现依赖文件的隔离存储,便于后续管理。
Hosted - Deployment policy 选择 Allow redeploy,因开发环境需支持重复发布相同版本依赖,满足迭代更新需求,若选默认的 Disable redeploy 会导致版本冲突。

3. 创建一个 proxy 类型的 pypi 仓库。

Proxy 类型 pipy 仓库是企业 python 环境的 “基础组件”—— 它不生产依赖,而是外部依赖的 “缓存代理站”。通过它,既能解决外部仓库访问慢、不稳定的问题,又能统一依赖来源、保障构建一致性,是团队协作中 “提升效率、降低风险” 的关键配置。一次下载,全员复用

image-20250912110634180 image-20250912110842840
配置项 具体内容及说明
Name pipy-proxy(自定义仓库名称,用于标识该代理仓库)
Proxy - Remote Storage 远程仓库地址:http://pypi.python.org/pypi/
Storage - Blob store 选择 python-devops(使用已创建的专用 Blob 存储,用于缓存从远程仓库下载的依赖)

4. 创建一个 group 类型的 pipy 仓库。

Group 类型的 pipy 仓库是企业依赖管理的 “统一门户”,通过聚合多个仓库,既能简化项目配置、避免版本冲突,又能灵活扩展仓库结构。实际使用中,通常将其作为项目唯一的依赖来源地址,是 Nexus 仓库体系中 “提升协作效率” 的关键一环。

  1. Group(仓库组):叫 pipy-group,是项目唯一的 “对接窗口”(项目只配置这个仓库组的地址),本身不存依赖,只负责 “调度”;
  2. Proxy(代理仓库):叫 pipy-proxy,对接远程公共仓库(比如 pipy 中央仓库 http://pypi.python.org/pypi/),核心能力是 “拉取远程依赖并缓存”;
image-20250912111815687 image-20250912112416216
配置类别 配置项 具体内容 / 状态 说明与作用
基础信息 Name pipy-group 仓库组的唯一标识,用于管理识别及项目配置依赖源时使用。
Online 已勾选 启用后仓库组处于在线状态,可接收依赖请求;未勾选则离线,无法响应请求。
存储配置 Blob store python-devops 指定专用 Blob 存储,用于存放仓库组相关的包缓存及聚合内容,实现存储隔离与管理。
Strict Content Type Validation 已勾选 验证上传内容的 MIME 类型是否符合仓库规范,确保存储内容合法,避免后续使用异常。
组配置 Member repositories 已添加 pipy-localpipy-proxy 聚合内部私有仓库(pipy-local)和外部代理仓库(pipy-proxy),项目通过仓库组地址访问时,Nexus 按成员仓库优先级顺序查找依赖,实现私有包与公共包的统一获取。

(二)使用 nexus 构建

1. 配置私服地址

1. 复制 group 仓库地址

点击复制 pipy-group 仓库地址
image-20250912112624237

2. 安装包

pip3.10 install --trusted-host 10.10.0.5 -i http://10.10.0.5:8081/repository/pipy-group/simple django
查看构建过程确实用到了 npm-group 项目只对接仓库组,空仓库组让 Proxy 去远程拉依赖并缓存,Proxy 把缓存的依赖通过仓库组给项目
image-20250912114558995 image-20250912114649154

3. 全局配置

mkdir ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
timeout = 60
trusted-host = 10.10.0.5
index-url = http://10.10.0.5:8081/repository/pipy-group/simple
EOF

4. 拉取流程

流程拆解:项目首次拉取依赖的 5 步 “链路”

假设你现在执行 pip3.10 install django,项目需要下载 django 这个依赖(本地缓存和 Nexus 都没有),整个流程就像 “项目找 PyPI 仓库组要东西,仓库组让 PyPI Proxy 去远程 PyPI 源买,Proxy 买回来存好再给项目”,具体步骤如下:

1. 项目发起请求:“PyPI 仓库组,给我 django!”

项目的 pip 配置里(通过 -i 参数或 pip.conf),只写了 PyPI 仓库组 pipy-group 的地址(比如 http://10.10.0.5:8081/repository/pipy-group/simple/)。

当项目需要依赖时,不会直接找 PyPI Proxy 或远程 PyPI 源,而是只向 PyPI 仓库组发起请求:“我要 django==4.2.7,你帮我找一下”。

2. 仓库组调度:“我这里没有,让 PyPI Proxy 去远程拉!”

PyPI 仓库组 pipy-group 本身不存依赖,它的作用是 “管理成员仓库的优先级”(你配置时,把 pypi-proxy 加进了仓库组)。 仓库组先检查自己的 “成员仓库”:

  • 首先看有没有 Hosted 私有 PyPI 仓库(比如 pypi-local),发现里面是空的;
  • 再看 Proxy 仓库 pypi-proxy,发现里面也没有这个依赖;
  • 于是仓库组告诉 pypi-proxy:“你去对接的远程 PyPI 源(如官方源 https://pypi.org/simple/)把这个依赖拉回来”。

3. PyPI Proxy 拉取远程依赖:“远程 PyPI 源,给我寄 django!”

pypi-proxy 仓库收到仓库组的指令后,会根据自己配置的 “远程 PyPI 源地址”(如 https://pypi.org/simple/),向远程 PyPI 源发起请求: “我需要 django==4.2.7,麻烦发给我”。

远程 PyPI 源收到请求后,会把这个依赖的包文件(.whl.tar.gz 等)传给 pypi-proxy 仓库。

4. PyPI Proxy 缓存依赖:“先存起来,下次不用再跑远路了!”

pypi-proxy 仓库拿到远程传来的 django 依赖后,不会直接转发,而是先做一件关键的事 ——把依赖缓存到自己的 Blob 存储(比如你配置的 pypi-blob)里。 这一步就是 PyPI Proxy 仓库的核心价值:“首次拉取,后续复用”—— 下次再有人要这个依赖,pypi-proxy 直接从缓存里拿,不用再去远程 PyPI 源下载(省时间、省网络)。

5. 仓库组反馈给项目:“依赖来了,拿好!”

pypi-proxy 仓库缓存完成后,会把依赖传给 PyPI 仓库组 pipy-group; 仓库组再把依赖转发给发起请求的项目,项目拿到依赖后,就能继续完成安装、运行等操作。

6. 第二次拉取的变化(理解 “缓存” 的意义)

如果下次另一个项目(或同一个项目再次执行 pip3.10 install django)需要同样的 django==4.2.7 依赖,流程会简化,跳过 “远程拉取” 步骤:

  1. 项目找 PyPI 仓库组要依赖;
  2. 仓库组找 pypi-proxy 仓库;
  3. pypi-proxy 仓库发现自己已经缓存了这个依赖,直接传给仓库组;
  4. 仓库组再传给项目 —— 整个过程不用访问远程 PyPI 源,速度快很多。