问题描述
您可以将需求分为“安装”依赖项和“测试”依赖项,如下所示:
import os
from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__))
install_requires = [
'pyramid',
'pyramid_debugtoolbar',
'waitress',
'requests',
'gunicorn',
'mongoengine',
]
tests_require = [
'mock',
'nose',
]
setup(name='repoapi',
...
install_requires=install_requires,
tests_require=tests_require,
test_suite="nose.collector",
...
)
这样,当有人安装软件包时,仅安装“安装”依赖项。因此,如果某人只想使用该软件包(他们对运行测试不感兴趣),那么他们就不必安装测试依赖项。
当您确实要运行测试时,可以使用以下命令:
$ python setup.py test
根据文档:
请注意,这些必需的项目不会安装在运行测试的系统上,只有在尚未本地安装时才下载到项目的安装目录中。
一旦“测试”依赖关系到位,它将运行“ test_suite”命令。由于您提到过鼻子是您首选的测试跑步者,因此我向您展示了如何使用“ nose.collector”进行配置。
顺便说一句,Django setup.py并不是理解setuptools基础的最干净的例子。我认为Sentry setup.py是一个更好的例子。
解决方法
这是我目前的做法:
import os
from setuptools import setup,find_packages
here = os.path.abspath(os.path.dirname(__file__))
requires = [
'pyramid','pyramid_debugtoolbar','waitress','requests','mock','gunicorn','mongoengine',]
setup(name='repoapi',version='0.0',description='repoapi',packages=find_packages(),include_package_data=True,zip_safe=False,install_requires=requires,tests_require=requires,test_suite="repoapi",entry_points="""\
[paste.app_factory]
main = repoapi:main
""",)
这样可以吗?我有些麻烦 例如,对于金字塔,我不能使用系统范围内的鼻子测试插件来运行测试。我需要pyramid
在全局python网站包中安装!
但是我不想要那个。因此,我必须在该项目的virtualenv中安装鼻子。但是我不希望它成为依赖。我觉得它不应该属于requires
。不是。但是,我也不想一直手工安装。是的,我知道我有很多我不想这样做,而且…
但是,您将如何解决呢?我不想篡改全局python站点包,但我想将鼻子安装为virtualenv的一部分。
另外,请安装pip安装要求文件。因为我不需要手动指定版本,而且我也不必担心手动更新setup.py,所以它稍微准确一些。随便扔pip freeze >
file.txt
。
但是,pip可以返回垃圾,因为我们将垃圾包扔到了virtualenv中。
这么多刀片。最佳做法是什么?您如何处理这些问题?
也许我错过了,但是https://github.com/django/django/blob/master/setup.py,Django是怎么做到的?