当前在 pip 的源中,有很多中国的源,但是,如果我们自己私人或者公司有一些不想公开的库,但是又希望使用 pip 工具管理的话,搭建自己的 pip 源是个不错的方法,在这种需求下就要求搭建简单方便,并且尽可能少的占用空间,在寻找对比了不少工具之后,我选用了一款开源的工具 —— pypiserver。本文就将介绍一下如何使用 pypiserver 作为服务器搭建一个自己的源,并且如何配置本地的 pip 工具。

安装 pypiserver

pypiserver 的安装很简单,他支持多种方式,比较常见的方法有两种,一种是安装 pypiserver 库,然后用命令行启动,另外一种是下载单一 python 文件,执行 python 文件启用,这里介绍的是安装库,以命令行的方式启用:

1
2
pip install pypiserver 
pip install passlib  # 上传需要用到

设置 pypiserver

安装完 pypiserver 之后,我们需要做一些配置,其实配置很简单,只是有些是必要的,例如

创建库存放目录

1
sudo mkdir -p /var/pypi/packages

设置上传用户密码

1
htpasswd -sc htpasswd.txt admin

配置 setuptools 工具

1
vim ~/.pypirc

在文件里面填入内容:

1
2
3
4
5
6
7
8
[distutils]
index-servers =
  local

[local]
repository: http://localhost:8080
username: admin
password: admin

启动 pypiserver

简单配置之后,我们就可以将服务器跑起来了:

1
pypi-server -p 8080 -P htpasswd.txt /var/pypi/packages &

测试 pypiserver

1
2
3
4
5
6
export PIP_EXTRA_INDEX_URL=http://localhost:8080/simple/

git clone https://github.com/pallets/flask.git
cd flask
python setup.py sdist upload -r local
ls -al /var/pypi/packages

你应该会发现在 /var/pypi/packages 目录下出现了一个包:

1
2
3
➜  flask git:(master) ll /var/pypi/packages 
total 524K
-rw-rw-r-- 1 tyrael tyrael 521K Aug 28 18:45 Flask-0.11.2.dev0.tar.gz

这样就说明我们的之间服务器是正常的。

从本地源中安装包

使用本地源安装包的话有需要配置的,也有不需要配置的方法。如果用配置的话以后每次使用起来就简单很多,但是,如果不配置的话使用起来就麻烦一些,这里就使用配置的方法吧:

1
vim ~/.pip/pip.conf

然后在里面填入两行:

1
2
[global]
extra-index-url = http://localhost:8080/simple/

这个时候我们就可以简单得使用 pip 下载了:

1
pip install Flask

扩展问题

1. 如何配置 https

pypiserver 自身不支持配置 https,但是,作者的推荐是在 nginx 后面代理 pypiserver,使用 nginx 来支持 https 访问。

2. 如果上传包到 pypi.python.org

其实上传到 pypi.python.org 和上传到本地差不多,只不过是地址和用户名变了,将 .pypirc 内容修改为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[distutils]
index-servers =
  pypi
  local

[pypi]
repository: https://pypi.python.org/pypi
username:<your_pypi_username>
password:<your_pypi_passwd>

[local]
repository: http://localhost:8080
username: admin
password: admin

然后上传的时候这样敲:

1
2
python setup.py register -r pypi
python setup.py sdist upload -r pypi

这样就上传到了 pypi 源了。

3. 如何指定官方源

默认得,如果对于在本地源中不存在的库,pypiserver 会从 pypi 中下载,如果你希望从其他地方下载,例如 豆瓣源、阿里源,那么你可以在启动服务器的时候增加参数 --fallback-url

1
pypi-server -p 8080 -P htpasswd.txt --fallback-url http://mirrors.aliyun.com/pypi/simple/ /var/pypi/packages &