使用 pip 命令安装 Python 包时,默认去 https://pypi.python.org/simple/ 源查找相应的包,下载并安装。但是在内网环境,或者需要发布一些私有包提供给指定用户时,就需要搭建自己的 PyPI Server。本篇主要记录使用 devpi 工具搭建 PyPI Server 源的过程,以及记录一些常用命令。
1. PyPI Server 比较
PyPI Server | PyPI 代理镜像 | 本地缓存 | 单元测试 | 系统测试 | 搜索 |
---|---|---|---|---|---|
devpi | 支持 | 支持 | ★★★★ | ★★★★★ | 支持 Web + XML RPC |
DjangoPyPI | 支持 | 不支持 | ★ | 无 | 支持 Web + XML RPC |
chishop | 不支持 | 不支持 | 无 | 无 | 不支持 |
pypiserver | 支持 | 不支持 | ★★★★★ | 无 | 不支持 |
Cheese Shop | 不支持 | 不支持 | ★★ | 无 | 支持 Web + XML RPC |
localshop | 支持 | 支持 | ★★★★ | 无 | 只支持 XML RPC |
mypypi | 不支持 | 不支持 | ★★ | 无 | 不支持 |
proxypypi | 支持 | 支持 | 无 | 无 | 不支持 |
Flask-Pypi-Proxy | 支持 | 支持 | 无 | 无 | 不支持 |
2. devpi 特有的功能
2.1 索引继承
pypiserver 等只支持两个索引: 私有的索引和公有的索引。 在私有索引上找不到 Python 包时, 就会去公有索引上找。 devpi 对这一功能做了扩展, devpi 可以支持多个索引。同时,新索引可以继承之前的索引,这在维护多版本系统上十分有用。
2.2 支持集群部署
支持一台或多台服务器部署,来加速访问。还支持通过 json 接口,实时监控集群的状态。
2.3 支持导入导出功能
支持导出服务器状态,并在必要时重新导回服务器,恢复服务器状态。
2.4 Jenkins 集成
支持给索引设置 Jenkins 触发器,可以使用 tox 自动测试上传的包。
3. 搭建 devpi server
devpi 包含三个组件:
- devpi-server,是 devpi server 核心组件,提供镜像与缓存功能
- devpi-web,提供 Web 界面与查询功能
- devpi-client,命令行工具, 提供包上传等与服务器交互的功能
3.1 安装 devpi
|
|
3.2 启动 devpi server 服务
|
|
通过 http://localhost:3141 访问页面:
可以看到新建了两个索引,一个是 root 的,一个是当前操作用户的。通过命令,可以查看索引信息:
|
|
由于 root 的索引配置了 mirror_url
,相当于在本地建立了一个附加的 Pypi 源, https://pypi.python.org/simple/。
另外一个索引 chenshaowen/dev,则仅能通过上传来新增包。
|
|
常用 devpi-server 服务端操作命令:
|
|
3.3 基本 devpi client 操作
devpi 是通过 client 与 devpi server 进行交互配置的。下面是一些基本的交互操作命令:
- devpi login root –password,登陆,首次启动密码为空
- devpi user -m root password=123,修改密码
- devpi logoff,退出登陆
- devpi user -c myuser password=mypassword [email protected],创建新用户
- devpi login myuser –password=mypassword
- devpi index -c dev bases=root/pypi 创建索引
- devpi use chenshaowen/dev,使用索引
- devpi upload ,上传包,需要在 setup.py 所在目录下执行
- devpi upload –with-docs,上传包,支持 sphinx 创建的文档,需要 docs 目录和 setup.py 在同个目录下
- devpi index myuser/dev mirror_url = “https://pypi.doubanio.com/simple/" , 当仓库中不存在包时,从豆瓣下载包缓存到本地(默认是从官方源
https://pypi.python.org/simple/
下载) - devpi push,将包从一个索引推送到另外一个索引
通过 devpi 命令可以新建索引,对索引中的包和权限进行管理,具体操作步骤可以参考官方文档。
4. 客户端配置
在服务器上运行 devpi server 之后,还需要通过 Nginx 反向代理对外提供服务。具体配置可以参考官方文档。这里以 Nginx 已经配置了 devpi.example.com
域名为例:
本地新建 ~/.pip/pip.conf 文件,内容如下:
|
|
这样就将 pip 默认的安装源指向了 devpi server。