我希望将Python软件包的依赖项分为setup_requires
和tests_require
,以确保完全分离依赖项。
我运行的测试命令需要将一些控制台脚本安装到环境(flake8
,mypy
,nosetests
)。这些在test_requires
中列为依赖项。
当我运行python setup.py test
时,tests_require
下的要求会以鸡蛋的形式下载,但是通常不会安装到您的虚拟环境中的控制台脚本不可用。
因此,测试命令失败,因为flake8
等不可用。
有没有办法解决这个问题?
这与Specifying where to install 'tests_require' dependencies of a distribute/setuptools package非常相似,但不完全相同;因为我并不特别在意软件包的安装位置,所以可以使用软件包公开的控制台脚本。
到目前为止,我发现的唯一解决方法是用setup_requires
的内容扩展tests_require
,但这违反了将仅测试需求与安装软件包的需求分开的目的。 / p>
可以复制此示例的示例setup.py
:
import subprocess
import sys
from setuptools import setup
from setuptools.command.test import test as TestCommand
install_requires = ["flask", "gunicorn"]
tests_require = ["flake8", "mypy", "nose"]
# Uncommenting this fixes the problem, but is not optimal
# install_requires += tests_require
class FooTests(TestCommand):
description = "run linters, and tests"
def run_tests(self):
self._run(["flake8", "tests", "my_package"])
self._run(["mypy", "--ignore-missing-imports", "my_package"])
self._run(["nosetests", "-vv"])
def _run(self, command):
subprocess.check_call(command)
setup(
name="my_package",
version="1.0",
description="Example package",
packages=["my_package"],
install_requires=install_requires,
tests_require=tests_require,
cmdclass={"test": FooTests},
)