通常我們使用pip安裝python包,都會預設從 https://pypi.python.org/pypi 上安裝,非常方便。
但是有些是公司內部的專案,不方便放到外網上去,這個時候我們就要搭建自己的內網pypi源伺服器,需要安全並且擁有同樣的舒適體驗。
python官方有個pypi私有源實現的說明:http://wiki.python.org/moin/PyPiImplementations ,並且列出了幾個比較成熟的實現方案:
- PyPI , aka CheeseShop – The reference implementation, powering the main index.
- ClueReleaseManager
- EggBasket – A simple, lightweight Python Package Index (aka Cheeseshop) clone.
- haufe.eggserver – Grok-based local repository with upload and no security model.
- Plone Software Center
- chishop – django based
- pypiserver – minimal pypi server, easy to install & use
我選擇pypiserver,因為他最小而且使用簡單。下面是搭建的過程。
安裝和快速上手
1 2 3 4 5 6 |
$ pip install pypiserver $ mkdir ~/packages # copy some source packages or eggs to this directory $ pypi-server -p 8080 ~/packages $ pip install -i http://localhost:8080/simple/ ... |
改進
我們用supervisor來管理pypi-server。
- 安裝supervisor
$ sudo apt-get install supervisor $ ps aux|grep supervisor # 檢視後臺是否已經執行起來了
- 安裝pypi server
$ cd /PATH/TO/PRIVATEPYPI $ virtualenv pypienv # 建立一個virtaulenv
$ source PATH/TO/PRIVATEPYPI/pypienv/bin/activate $ pip install pypiserver #安裝pypi server
$ mkdir PATH/TO/PRIVATEPYPI/packages # 建立存放packages的資料夾
- 編寫指令碼/PATH/TO/PRIVATEPYPI/run-pypi.py,作用是在virtualenv中啟動pypiserver。
#!/bin/sh # 啟動virtualenv . /PATH/TO/PRIVATEPYPI/pypienv/bin/activate # 使用埠號3141,因為pypi與π諧音,π≈3.141 exec pypi-server -p 3141 /PATH/TO/PRIVATEPYPI/packages
- 在supervisor中配置啟動pypi server
新建檔案/PATH/TO/PRIVATEPYPI/pypi-server.conf,內容如下:
[program:pypi-server] directory=/PATH/TO/PRIVATEPYPI/ command=sh run-pypi.sh autostart=true autorestart=true redirect_stderr=true
將該檔案軟鏈到supervisor的配置資料夾下:
$ cd /etc/supervisor/conf.d/ $ sudo ln -s /PATH/TO/PRIVATEPYPI/pypi-supervisor.conf pypi-supervisor.conf
- 重啟supervisor
$ sudo /etc/init.d/supervisor stop $ sudo /etc/init.d/supervisor start
這時候在瀏覽器中訪問 http://localhost:3141/ ,就可以看到pypiserver的歡迎頁面了。
- 上傳package
- 上傳package需要使用者名稱密碼,密碼檔案使用命令htpasswd生成
1234$ pip install passlib$ apt-get install apache2-utils$ htpasswd -sc /PATH/TO/PRIVATEPYPI/.htaccess user # 回車後會提示輸入密碼,輸入123
- 修改run-pypi.sh, 啟動pypi server時載入密碼檔案
12345#!/bin/sh. ./pypienv/bin/activateexec pypi-server -p 3141 -P ./.htaccess ./packages
- 用前面的方法重新啟動supervisor。
- 在使用者的主目錄下新建檔案.pypirc(也可以在/PATH/TO/PRIVATEPYPI/下新建,通過軟鏈連結到home目錄下,推薦使用),寫入下面的內容:
123456789[distutils]index-servers =privatepypi[privatepypi]repository:http://127.0.0.1:3141username:userpassword:123
- 上傳package檔案:
12$ python setup.py sdist upload -r privatepypi
- 上傳package需要使用者名稱密碼,密碼檔案使用命令htpasswd生成
- 下載package
$ pip install -i http://localhost:3134/simple/ some-package