搭建本地pip源

搭建本地pip源

基础介绍

很多时候,我们都是一起安装多个包, 所以推荐使用requirements.txt文件的方式,这样也方便管理包和包版本。

requirements.txt文件,可以指定版本package==1.0.0, 也可以不指定packge版本, 并且每个包和版本都在一行上,例如:

django==3.2.0
ipython 

这将下载3.2.0版本的django,和最新版本的ipython,以及它们的依赖文件。

有关pip2pi的更多文档,请查看

安装pip2pi工具

我们使用pip2pi这个包来下载和创建源的索引。

安装pip install pip2pi, 会安装两个命令pip2tgzdir2pi,后文我们基本都会使用到。

1.下载包
pip2tgz可以下载单独的包,pip2tgz /home/pypi/pypi django==3.2.0,如果不指定版本(即==3.2.0),那么就会下载最新版本,
命令中指定的/home/pypi/pypi是存放下载的包源文件的目录,可以更改为自己想要的目录。

也可以批量下载包,pip2tgz /home/pypi/pypi -r requirements.txt
-r requirements.txt,这句说明下载requirements.txt文件中指定的包。

2.建立索引
dir2pi /home/pypi/pypi, 会在/home/pypi/pypi目录中创建一个名为simple的文件夹。

3.使用本地文件安装包
我们此时已经可以直接使用本地的源来安装了,尽管还不能从公网访问。
使用命令:

pip install --index-url=file:///home/pypi/pypi/simple django==3.2.0 

当然我们也可以搭建Web服务,来允许在网络上使用。

搭建Web服务

我们需要使用到nginx,使用命令yum install nginx进行安装。

安装完成后,我们需要修改nginx的配置文件/etc/nginx/nginx.conf

修改配置为:

server {
    listen 80;
    server_name example.com;  # 也可以使用IP的方式
    root /home/pypi/pypi;  # 此处直接指定到simple的父级目录,这样我们可以使用http://example.com/simple来作为源的链接
    location /{
        autoindex on;
        autoindex_exact_size off; #显示文件的大小
        autoindex_localtime on; #显示文件时间
        # limit_rate_after 5m; #5分钟后下载速度限制为200k
        limit_rate 200k;
    }
    access_log /var/log/nginx/pypi.log main;
} 

使用nginx -t查看配置文件是否正确,以下的提示为配置正确:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful 

重启nginx服务器,让修改后的配置生效,systemctl restart nginx

如果访问example.com/simple403错误,
可以使用命令 ps -ef | grep nginx 查看显示的worker process是否是和pypi文件夹的权限一致,
如果不一致, 修改/etc/nginx/nginx.conf文件中的user xxx为:user name group,
其中namegroup/home/pypi/pypi的文件夹用户和组(可以使用命令ls -alh /home/pypi/pypi 查看)。

使用新的pypi源

我们已经完成了Web服务的搭建,此时可以修改pip的源,以便安装包时,可以使用我们自己的源。

  • 临时使用我们的源安装包
pip install --index-url=http://example.com/simple/ django=3.2.0 
  • 修改全局配置,每次安装包都从我们的源来安装
    修改全局的pip配置文件,编辑~/.pip/pip.conf文件:
[global]
index-url=http://example.com/simple 

如果我们使用虚拟环境,那么也可以同时修改虚拟环境的pip配置文件,编辑虚拟环境中venv_name/pip.conf:

[global]
index-url=http://example.com/simple
#[install]
#trusted-host=ip # 如果是IP的形式,我们需要信任这个IP 

然后我们就可以直接安装包了:

pip install django==3.2.0
pip install ipython