自己搭建 pypi 服务器

创建包

mkdir example_pkg
cd example_pkg/
touch __init__.py
echo 'name = "example_pkg"' > __init__.py
cd ..
echo "This is long readme" > README.md
vim setup.py

setup.py 内容

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="example_pkg",
    version="0.0.1",
    author="Example Author",
    author_email="author@example.com",
    description="A small example package",
    url="",
    long_description=long_description,
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 2",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
)

如果需要将额外的文件,打包进去,则需要写 MANIFEST.in 文件,示例:

$ cat MANIFEST.in 
recursive-include rpc_client_api *

参考:https://docs.python.org/3/distutils/sourcedist.html#the-manifest-in-template

安装 setuptools 和 wheel

pip install --user --upgrade setuptools wheel

然后生成包文件

$ sudo python setup.py sdist bdist_wheel
$ ls dist/
example_pkg-0.0.1-py2-none-any.whl  example_pkg-0.0.1.tar.gz

.whl 文件和 .tar.gz 文件就是生成好的包文件,其中 pip 安装的时候,会优先使用 whl 文件。

参考 https://packaging.python.org/tutorials/packaging-projects/

用 nginx 搭建 pypi server

创建好目录,用于存储生成的包文件,并把我们刚生成好的包文件拷贝到目录中。

cd /var/www
mkdir pypi_packages && cd pypi_packages
mkdir example_pkg && cd example_pkg
scp vagrant@172.31.0.32:/home/vagrant/projects/example_pkg/dist/* .
cd ..

$ tree
.
└── example_pkg
    ├── example_pkg-0.0.1-py2-none-any.whl
    └── example_pkg-0.0.1.tar.gz

编辑 nginx 配置文件

$ cat /etc/nginx/conf.d/pypi.conf

server {
    listen 80;
    server_name pypi.server.com;

    access_log /var/log/nginx/pypi-access.log;
    error_log /var/log/nginx/pypi-error.log error;

    root /var/www/pypi_packages/;

    location / {
        autoindex on;
    }
}

设置一下 pypi.server.com 的 hosts ,指向 nginx 服务器所在的ip地址,然后通过浏览器访问,应该就可以看到文件列表。

在 pip 命令中使用我们的服务

可以直接在 pip 命令后面添加 –extra-index-url 参数

$ env/bin/pip install --extra-index-url http://pypi.server.com/ example_pkg

或者把参数写到 requirements.txt 中也是可以的

$ cat requirements.txt

--extra-index-url http://pypi.server.com/
example_pkg == 0.0.1

$ pip install -r ./requirements.txt

或者全局配置参数

$ vim ~/.pip/pip.conf

[global]
extra-index-url = http://pypi.server.com/

使用 pypiserver 搭建 server

如果不想用 nginx,或者想通过命令行来方便地上传包到 server,可以使用 pypiserver 这个包来运行server

sudo pip install pypiserver
sudo pypi-server -p 80 /var/www/pypi_packages/ &

pip install --extra-index-url http://pypi.server.com/simple/ example_pkg

配置用户权限

pip install passlib
htpasswd -sc .htaccess <some_username>
sudo ./pypi-server -p 80 -P .htaccess /var/www/pypi_packages/ &

在本地端配置 pip,使用密码

$ cat ~/.pypirc
[internal]
repository: http://pypi.server.com
username: <some_username>
password: <some_passwd>

然后打包的时候,上传到我们的 pypi server

python setup.py sdist upload -r internal

参考 https://pypiserver.readthedocs.io/en/latest/