最佳做法:如何在setup.py中列出所需的依赖项?

问题描述

您可以将需求分为“安装”依赖项和“测试”依赖项,如下所示:

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是怎么做到的?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...