部署私有 pip 库教程
准备工作
部署私有 pip 库需要使用 pypiserver 这个 Python 包。我们建议使用 docker 部署,方便快捷。首先我们到部署的服务器上,创建一个存放配置和包的目录,我的是:/var/www/pypiserver 。
我们使用了 Docker swarm 来部署,参考了这里的配置:https://github.com/pypiserver/pypiserver/blob/master/docker-compose.yml。以下是我的配置文件:
# /var/www/pypiserver/docker-compose.yml
version: "3.3"
services:
pypiserver:
image: pypiserver/pypiserver:latest
volumes:
- type: bind
source: ./packages
target: /data/packages
- type: bind
source: ./auth
target: /data/auth
command: -P /data/auth/.htaccess -a update,download,list /data/packages
ports:
- "8081:8080"
从配置可以看出,我们需要在该目录下创建两个目录,一个用来存放 package,一个用来存放用户认证文件,目录结构如下:
.
├── auth
├── docker-compose.yml
└── packages
需要注意 packages 目录要开写权限,否则 docker 无法写入该目录,上传包会失败。
Auth
认证主要是为了从远程上传包的时候安全一点,具体步骤如下:
# 安装依赖
sudo pip3 install passlib
# 生成 htpass 文件
htpasswd -sc .htaccess your_name # 会 prompt 密码输入,重复两遍一样的
把上述文件放到 auth 目录即可。
启动
一切就绪后,在 /var/www/pypiserver 目录下运行以下命令,以 docker service 的方式(即 swarm 模式)运行 docker container:
docker stack deploy -c docker-compose.yml pip-server
这样,你的私有 pip 服务就启动了。
上传 Python 包
下一步,假设你本地的开发环境中,已经有了一个自己的 Python 包的源码,接下来就是构建和上传这个包。
# 安装依赖
pip3 install wheel
pip3 install -U setuptools # 可能需要升级,否则识别不了某些新的 setup.py 中的字段
# build package
python3 setup.py sdist bdist_wheel
生成的 tar.gz 文件会被放在 dist 目录下。你可以直接把这个文件放到服务器的 packages 目录,这样直接就可以用了。但是我们觉得开发者可能会频繁改动代码,每次都手动上传并 copy 到那个目录,太麻烦了。我们准备使用工具从客户端直接上传这个包到 pypiserver。
# 安装上传工具,用于上传你 build 好的 package 到私有库
pip3 install twine
在上传之前,我们还需要配置一下 ~/.pypirc,这个文件保存了你的 pip 库的路径和鉴权等信息,这样你就不用每次上传时都要输入密码了。这个文件长成这个样子:
[distutils]
index-servers =
pypi
internal
[pypi]
username:<your_pypi_username>
password:<your_pypi_passwd>
[internal]
repository: http://your_pipserver:8081
username: <some_username>
password: <some_passwd>
如果你无意把私有包上传到公共仓库,pypi 部分可以删掉。接下来,运行一下命令就可以上传你的包了:
twine upload -r internal ./dist/yourpackage-0.0.1.tar.gz
会出现一个进度条,等走完了就大功告成了。
从私有库安装
运行下面命令即可安装
sudo pip3 install --trusted-host yourserver \
--extra-index-url http://youruser:yourpass@yourserver:8081/simple \
yourpackage
这里有一些注意事项:
-
没有给服务器配置 https 的情况下,需要 --trusted-host 参数,否则 pip 会 ignore 这个仓库
-
如果你没有设置 Auth 的话,url 中就不需要 youruser:yourpass@ 这部分了;
-
如果你的 package 奇葩地和公共库中的某个包(和我们一样)重名了,你应该用 --index-url 来代替 --extra-index-url,这样它就会优先找你的包了。这样做的问题是你可能需要:
-
添加一个 --no-deps 参数,防止 pip 从你的库中寻找你的包的依赖(当然,它是找不到的,你只有你自己的包)
-
然后手动安装你的包的依赖
这就是搭建一个私有 pip 库的最简单方法。大功告成!
转自 https://zhuanlan.zhihu.com/p/99340587