一套好的requirements.txt
和setup.py
要满足:
- 自动安装服务依赖,包括公有依赖(pypi上面)和私有依赖(私有tar包、git仓库等);
python setup.py install
、pip install
两种方式都能正常安装;
setup.py
import os
from setuptools import setup, find_packages
def _process_requirements():
packages = open('requirements.txt').read().strip().split('\n')
requires = []
for pkg in packages:
if pkg.startswith('git+ssh'):
return_code = os.system('pip install {}'.format(pkg))
assert return_code == 0, 'error, status_code is: {}, exit!'.format(return_code)
else:
requires.append(pkg)
return requires
setup(
name='foo',
version='1.0.0',
author='brown',
description="just a test",
packages=find_packages(),
install_requires=_process_requirements()
)
requirements.txt
redis>=2.10.6
git+ssh://git@github.com/<user>/<repo_name>@<branch>
注意
- 这里我们在setup.py里面自己处理了私有git仓的安装。其实setup函数提供了
dependency_links
参数供我们实现此功能,但实测下来还是比较麻烦,我遇到的情况是:python setup.py install
能正常安装,但pip
安装就一直失败。 - pip安装时,setup.py里面的控制台输出,正常情况都是不显示的,因为pip安装使用了子进程,并默认禁止了控制台输出,你可以
pip -v
把其显示出来。