因最近在整理python的笔记,里面有一些关于pipy的内容,就萌发了想搭建一个本地私有的pip源的想法。
本文的演示环境为:
- Alpine Linux
- python 3
1. 安装 Python 和 pip
首先需要确定系统中已经有 python 3,如果没有,可以直接使用下面的命令安装:
# apk add python3
安装完成后,使用下面的命令安装 pip3
# apk add py3-pip
2. 创建存放软件包的仓库和虚拟环境
创建 /pypi/Package 目录,并进入到目录中,创建虚拟环境并激活环境
mkdir -p /pypi/Package
cd /pypi/
python3 -m venv ./venv
3. 安装 pip2pi 工具
先安装 setuptools ,否则可能会在使用后面 pip2pi 的命令时报错。使用 pip 安装 pip2pi
(venv) localhost:/pypi# pip install pip2pi
Collecting pip2pi
Downloading pip2pi-0.8.2-py2.py3-none-any.whl.metadata (5.9 kB)
Requirement already satisfied: pip>=1.1 in ./venv/lib/python3.12/site-packages (from pip2pi) (24.2)
Downloading pip2pi-0.8.2-py2.py3-none-any.whl (10 kB)
Installing collected packages: pip2pi
Successfully installed pip2pi-0.8.2
[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: pip install --upgrade pip
4. 下载软件包并建立索引
单独下载某个软件包
# pip3 download requests -d /pypi/Package/
Collecting requests
Downloading requests-2.32.3-py3-none-any.whl.metadata (4.6 kB)
Collecting charset-normalizer<4,>=2 (from requests)
Downloading charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl.metadata (35 kB)
Collecting idna<4,>=2.5 (from requests)
Downloading idna-3.10-py3-none-any.whl.metadata (10 kB)
Collecting urllib3<3,>=1.21.1 (from requests)
Downloading urllib3-2.3.0-py3-none-any.whl.metadata (6.5 kB)
Collecting certifi>=2017.4.17 (from requests)
Downloading certifi-2024.12.14-py3-none-any.whl.metadata (2.3 kB)
Downloading requests-2.32.3-py3-none-any.whl (64 kB)
Downloading certifi-2024.12.14-py3-none-any.whl (164 kB)
Downloading charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl (146 kB)
Downloading idna-3.10-py3-none-any.whl (70 kB)
Downloading urllib3-2.3.0-py3-none-any.whl (128 kB)
Saved ./Package/requests-2.32.3-py3-none-any.whl
Saved ./Package/certifi-2024.12.14-py3-none-any.whl
Saved ./Package/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl
Saved ./Package/idna-3.10-py3-none-any.whl
Saved ./Package/urllib3-2.3.0-py3-none-any.whl
Successfully downloaded requests certifi charset-normalizer idna urllib3
[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: pip install --upgrade pip
也可以用下面的方式下载
(venv) localhost:/pypi# pip2tgz /pypi/Package/ numpy
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
Collecting numpy
Downloading numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl.metadata (62 kB)
Downloading numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl (17.9 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 17.9/17.9 MB 20.1 kB/s eta 0:00:00
Saved ./Package/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl
Successfully downloaded numpy
[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: pip install --upgrade pip
Done. 1 new archives currently saved in '/pypi/Package/'.
下载完成后,使用以下命令建立索引:
dir2pi /pypi/Package
5. 配置 Web 服务
可以使用 Nginx 作为 Web 服务器来提供本地 pip 源。安装 Nginx:
# apk add nginx
(1/4) Installing pcre (8.45-r3)
(2/4) Installing nginx (1.26.2-r4)
Executing nginx-1.26.2-r4.pre-install
Executing nginx-1.26.2-r4.post-install
(3/4) Installing nginx-openrc (1.26.2-r4)
(4/4) Installing nginx-vim (1.26.2-r4)
Executing busybox-1.37.0-r8.trigger
OK: 323 MiB in 129 packages
然后编辑 Nginx 配置文件
/etc/nginx/http.d/default.conf,添加以下内容:
server {
listen 80;
server_name localhost; # 可以替换为你的 IP 或域名
root /pypi/Package;
location / {
autoindex on;
autoindex_exact_size off; # 显示文件大小
autoindex_localtime on; # 显示本地时间
}
access_log /var/log/nginx/pypi.log main;
}
保存配置文件后,检查 Nginx 配置是否正确:
nginx -t
如果测试通过,重启 Nginx 服务:
rc-service nginx restart
6. 配置 pip 使用本地源(非必要)
在本地机器上,可以通过以下方式配置 pip 使用本地私有源:
创建或编辑 pip 配置文件
在用户主目录下创建 .pip 文件夹和 pip.conf 文件:
mkdir -p ~/.pip
vim ~/.pip/pip.conf
在 pip.conf 文件中添加以下内容:
[global]
index-url = http://<你的服务器IP或域名>/simple
trusted-host = <你的服务器IP或域名>
7. 测试本地私有源
访问仓库站点
在本地机器上运行以下命令测试是否可以使用本地源安装包:
pip install <包名> -i http://<你的服务器IP或域名>/simple/ --trusted-host <你的服务器IP或域名>
如果安装成功,说明本地私有源便已经搭建完成,可以供内部的内网使用。