測試環境是離線的,要在集成測試環境開發顯然需要搭建自己的本地 pip源。在使用 devpi 之前我曾使用過 pip2pi,但有個 bug 導致離線環境下的 tox 命令總是失敗,所以最后采用 devpi 搭建 pip源。這里使用 docker 部署,方便又快速,如果不小心弄崩了也只需要重新運行docker容器就好了。如果你的環境沒有安裝 docker 可以自行搜素安裝方法,比如 docker 社區的文檔 install docker(https://docs.docker.com/install/)。如果你是 Centos 用戶,可以使用以下方法安裝
sudo yum update sudo yum -y install docker sudo systemctl enable docker sudo systemctl start docker
接下來使用使用 docker 部署一個 Python 本地鏡像源,我們可以使用 docker hub 上已有的鏡像,我這里選擇的是
muccg/devpi(https://hub.docker.com/r/muccg/devpi) 這個鏡像
# 設置 devpi 服務器管理員密碼 DEVPI_PASSWORD = 123 mkdir -p /src/docker/devpi mkdir /tmp/wheelhouse docker run -d --name devpi \ --publish 3141:3141 \ --volume /tmp/wheelhouse:/wheelhouse --volume /srv/docker/devpi:/data \ --env=DEVPI_PASSWORD=$DEVPI_PASSWORD \ --restart always \ muccg/docker-devpi
接著先在本地下載好所需的wheel包,requirements.txt文件內容即為我們需要的 Python 庫列表
pip wheel --wheel-dir /tmp/wheelhouse -r requirements.txt
如果從 pip 源下載的庫已經是 wheel 包的話文件將會被直接放在 /tmp/wheelhouse 內,如果是
tar 包,pip 會先 build 出 wheel 包,這可能需要一些時間。下載完成后 wheelhouse 內容類似
于
ll /tmp/wheelhouse total 524K -rwxrwxrwx 1 rookie rookie 155K Apr 6 23:40 certifi-2019.3.9-py2.py3-none-any.whl -rwxrwxrwx 1 rookie rookie 131K Apr 6 23:40 chardet-3.0.4-py2.py3-none-any.whl -rwxrwxrwx 1 rookie rookie 58K Apr 6 23:40 idna-2.8-py2.py3-none-any.whl -rwxrwxrwx 1 rookie rookie 57K Apr 6 23:40 requests-2.21.0-py2.py3-none-any.whl -rwxrwxrwx 1 rookie rookie 116K Apr 6 23:40 urllib3-1.24.1-py2.py3-none-any.whl
下載完成后如果本地環境安裝了devpi客戶端,可以直接上傳 wheel 包,不過由于我們在創建容器時已經
把 wheelhouse 文件夾掛載進去,也可以在在容器里直接操作
# 進入容器
docker exec -it -u root devpi bash
# 登陸并上傳
devpi use http://<host_ip>:3141/root/public --set-cfg
devpi login root 123
devpi upload --from-dir /wheelhouse
上傳完成后可以使用 http://<host_ip>:3141 查看 pip 本地源服務器狀態。
若要臨時使用可以使用 pip install 的 –index 和 –trusted-host 選項
pip install --index http://<host_ip>:3141/root/public/+simple/ \
--trusted-host <host_ip>
或者修改 pip.conf 文件永久使用
# vim ~/.pip/pip.conf [global] index_url = http://<host_ip>:3141/root/public/+simple/ trusted-host = <host_ip> [search] index = http://<host_ip>:3141/root/public/