目录

    使用 pip 命令安装 Python 包时,默认去 https://pypi.python.org/simple/ 源查找相应的包,下载并安装。但是在内网环境,或者需要发布一些私有包提供给指定用户时,就需要搭建自己的 PyPI Server。本篇主要记录使用 devpi 工具搭建 PyPI Server 源的过程,以及记录一些常用命令。

    1. PyPI Server 比较

    PyPI ServerPyPI 代理镜像本地缓存单元测试系统测试搜索
    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

    pip install devpi
    

    3.2 启动 devpi server 服务

    [chenshaowen@localhost ~]devpi quickstart
    -->  /home/chenshaowendevpi-server --version 
    -->  /home/chenshaowendevpi-server --start --init 
    ...
    -->  /home/chenshaowendevpi index -c dev 
    http://localhost:3141/chenshaowen/dev:
      type=stage
      bases=
      volatile=True
      acl_upload=chenshaowen
      acl_toxresult_upload=:ANONYMOUS:
      mirror_whitelist=
      pypi_whitelist=
    
    -->  /home/chenshaowendevpi use dev 
    current devpi index: http://localhost:3141/chenshaowen/dev (logged in as chenshaowen)
    /home/chenshaowen/.pip/pip.conf: no config file exists
    ~/.pydistutils.cfg     : no config file exists
    ~/.buildout/default.cfg: no config file exists
    always-set-cfg: no
    COMPLETED!  you can now work with your 'dev' index
      devpi install PKG   # install a pkg from pypi
      devpi upload        # upload a setup.py based project
      devpi test PKG      # download and test a tox-based project 
      devpi PUSH ...      # to copy releases between indexes
      devpi index ...     # to manipulate/create indexes
      devpi use ...       # to change current index
      devpi user ...      # to manipulate/create users
      devpi CMD -h        # help for a specific command
      devpi -h            # general help
    docs at http://doc.devpi.net
    

    通过 http://localhost:3141 访问页面:

    可以看到新建了两个索引,一个是 root 的,一个是当前操作用户的。通过命令,可以查看索引信息:

    devpi  getjson /root
    {
        "result": {
            "indexes": {
                "pypi": {
                    "mirror_url": "https://pypi.python.org/simple/", 
                    "mirror_web_url_fmt": "https://pypi.python.org/pypi/{name}", 
                    "title": "PyPI", 
                    "type": "mirror", 
                    "volatile": false
                }
            }, 
            "username": "root"
        }, 
        "type": "userconfig"
    }
    

    由于 root 的索引配置了 mirror_url ,相当于在本地建立了一个附加的 Pypi 源, https://pypi.python.org/simple/。

    另外一个索引 chenshaowen/dev,则仅能通过上传来新增包。

    devpi  getjson /chenshaowen
    {
        "result": {
            "indexes": {
                "dev": {
                    "acl_toxresult_upload": [
                        ":ANONYMOUS:"
                    ], 
                    "acl_upload": [
                        "chenshaowen"
                    ], 
                    "bases": [], 
                    "mirror_whitelist": [], 
                    "pypi_whitelist": [], 
                    "type": "stage", 
                    "volatile": true
                }
            }, 
            "username": "chenshaowen"
        }, 
        "type": "userconfig"
    }
    

    常用 devpi-server 服务端操作命令:

    devpi-server --init
    devpi-server --start
    devpi-server --stop
    devpi-server --status
    devpi-server --log
    

    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=myemail@example.com,创建新用户
    • 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 文件,内容如下:

    [global]
    timeout = 60
    index-url = http://devpi.example.com/root/pypi/+simple/
    [install]
    trusted-host = devpi.example.com
    

    这样就将 pip 默认的安装源指向了 devpi server。

    5. 参考