如何 运行 tox -e myenv 针对其他环境?
How to run tox -e myenv against other environments?
是否可以在 tox 中让 tox -e hello
触发 hello 环境并在全局 envlist 上 运行?
运行 tox
运行 对 py2 和 py3 正确。
运行 tox -e hello
只针对 py3 运行s。
[tox]
skipsdist = True
envlist = py{27,37}
[testenv]
deps =
pytest
!py27: mock
commands =
{envpython} --version
; How to run this hello against the complete envlist?
[testenv:hello]
envlist = py{27,37}
commands =
echo hello
这在某种程度上似乎是预期的行为,但除了制作一堆 tox 文件之外,我不知道如何使用 tox 来解决问题:我想要 tox 有不同的命令入口点。例如,仅 运行 针对 py27
的单元测试,仅 运行 针对 py{27,37}
的单元测试,仅 运行 针对 py27-{libA,libB}
的集成测试等
也许这只是一种反模式,您可以以这种方式对单个环境使用 tox -e,但它会破坏 envlist?
那我只需要再做一个 tox.ini 吗?考虑到其他一切都与毒性有关的灵活性和重用导向,这似乎非常笨拙。我觉得我错过了什么。
这里主要理解两点:
envlist
是 [tox]
部分中的 global setting。在[testenv:hello]
中定义它没有效果
envlist
定义或生成 env
名称列表。这可以通过提供一个简单的逗号分隔列表来静态完成,或者 - 就像你所做的那样 - 从通过特殊语法 {...}
提供的因素组合生成列表。 both 情况下的结果是一个环境名称列表,然后将在 virtualenvs
/ venvs
. 中执行
所以要说得非常清楚:最后 envlist
是 env
名称的简单列表 - 没有别的。在 envs
.
中执行期间,正在对这些名称(或其部分 (a.k.a.factors) 进行处理)
如果你在没有 -e
的情况下调用 tox ,则会执行所有这些环境。在您的示例中,您 generating an envlist 使用 {<factorX>,<factorY>}
语法,该语法基于与命令行 shell 提供的相同原则。如果您在 tox 配置中请求生成的环境,结果将是:
$ tox -a
py27-hello
py37-hello
hello
这可能已经表明您的配置有点不对劲,因为我认为您不想要不合格的 hello
环境。
因此,您通过生成式创建 envlist 并使用 [testenv:hello]
语法静态提供 hello
testenv 所做的事情是以一种不会产生您想要的结果的方式混合它们有。
所以让我们调整您的 tox.ini
以摆脱不必要的静态定义 testenv:hello
。我们还删除了本地 envlist
键,因为它无论如何都没有效果。它没有抛出错误,因为在 envs
中任意命名的键是明确允许的,有时很有用。
[tox]
skipsdist = True
envlist = py{27,37}-hello
[testenv]
deps =
pytest
!py27: mock
# do not warn that echo is a command not in the venv
whitelist_externals = echo
commands =
{envpython} --version
hello: echo hello
为了确保 hello 命令只有 运行,当 env 有一个 hello
因素时,您可以使用 <factor>[,<factor>]: <some command>
来指定应该是 运行 如果env 名称包含某个 factor(由 -
分隔的名称部分)
正在生成一个环境名称列表,然后用作正在执行的具体环境的信息。
如果我在更改后的 ini 上再次调用 tox -a
,我会得到:
py27-hello
py37-hello
现在我可以通过调用例如tox -e py27-hello
甚至 tox -e hello
然后将使用 basepython 并执行适合该因素的所有操作。
为了更深入地了解正在发生的事情,您可以显示所有环境的完全解析配置,看起来像这样:
$ tox --showconfig
[testenv:py27-hello]
envdir = /home/ob/do/play/.tox/py27-hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py27-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py27-hello'}
basepython = python2.7
description =
envtmpdir = /home/ob/do/play/.tox/py27-hello/tmp
envlogdir = /home/ob/do/play/.tox/py27-hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest]
commands = [['/home/ob/do/play/.tox/py27-hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
[testenv:py37-hello]
envdir = /home/ob/do/play/.tox/py37-hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py37-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py37-hello'}
basepython = python3.7
description =
envtmpdir = /home/ob/do/play/.tox/py37-hello/tmp
envlogdir = /home/ob/do/play/.tox/py37-hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest, mock]
commands = [['/home/ob/do/play/.tox/py37-hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
[testenv:hello]
envdir = /home/ob/do/play/.tox/hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/hello'}
basepython = /usr/bin/python
description =
envtmpdir = /home/ob/do/play/.tox/hello/tmp
envlogdir = /home/ob/do/play/.tox/hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest, mock]
commands = [['/home/ob/do/play/.tox/hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
是否可以在 tox 中让 tox -e hello
触发 hello 环境并在全局 envlist 上 运行?
运行 tox
运行 对 py2 和 py3 正确。
运行 tox -e hello
只针对 py3 运行s。
[tox]
skipsdist = True
envlist = py{27,37}
[testenv]
deps =
pytest
!py27: mock
commands =
{envpython} --version
; How to run this hello against the complete envlist?
[testenv:hello]
envlist = py{27,37}
commands =
echo hello
这在某种程度上似乎是预期的行为,但除了制作一堆 tox 文件之外,我不知道如何使用 tox 来解决问题:我想要 tox 有不同的命令入口点。例如,仅 运行 针对 py27
的单元测试,仅 运行 针对 py{27,37}
的单元测试,仅 运行 针对 py27-{libA,libB}
的集成测试等
也许这只是一种反模式,您可以以这种方式对单个环境使用 tox -e,但它会破坏 envlist?
那我只需要再做一个 tox.ini 吗?考虑到其他一切都与毒性有关的灵活性和重用导向,这似乎非常笨拙。我觉得我错过了什么。
这里主要理解两点:
envlist
是[tox]
部分中的 global setting。在[testenv:hello]
中定义它没有效果envlist
定义或生成env
名称列表。这可以通过提供一个简单的逗号分隔列表来静态完成,或者 - 就像你所做的那样 - 从通过特殊语法{...}
提供的因素组合生成列表。 both 情况下的结果是一个环境名称列表,然后将在virtualenvs
/venvs
. 中执行
所以要说得非常清楚:最后 envlist
是 env
名称的简单列表 - 没有别的。在 envs
.
如果你在没有 -e
的情况下调用 tox ,则会执行所有这些环境。在您的示例中,您 generating an envlist 使用 {<factorX>,<factorY>}
语法,该语法基于与命令行 shell 提供的相同原则。如果您在 tox 配置中请求生成的环境,结果将是:
$ tox -a
py27-hello
py37-hello
hello
这可能已经表明您的配置有点不对劲,因为我认为您不想要不合格的 hello
环境。
因此,您通过生成式创建 envlist 并使用 [testenv:hello]
语法静态提供 hello
testenv 所做的事情是以一种不会产生您想要的结果的方式混合它们有。
所以让我们调整您的 tox.ini
以摆脱不必要的静态定义 testenv:hello
。我们还删除了本地 envlist
键,因为它无论如何都没有效果。它没有抛出错误,因为在 envs
中任意命名的键是明确允许的,有时很有用。
[tox]
skipsdist = True
envlist = py{27,37}-hello
[testenv]
deps =
pytest
!py27: mock
# do not warn that echo is a command not in the venv
whitelist_externals = echo
commands =
{envpython} --version
hello: echo hello
为了确保 hello 命令只有 运行,当 env 有一个 hello
因素时,您可以使用 <factor>[,<factor>]: <some command>
来指定应该是 运行 如果env 名称包含某个 factor(由 -
分隔的名称部分)
正在生成一个环境名称列表,然后用作正在执行的具体环境的信息。
如果我在更改后的 ini 上再次调用 tox -a
,我会得到:
py27-hello
py37-hello
现在我可以通过调用例如tox -e py27-hello
甚至 tox -e hello
然后将使用 basepython 并执行适合该因素的所有操作。
为了更深入地了解正在发生的事情,您可以显示所有环境的完全解析配置,看起来像这样:
$ tox --showconfig
[testenv:py27-hello]
envdir = /home/ob/do/play/.tox/py27-hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py27-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py27-hello'}
basepython = python2.7
description =
envtmpdir = /home/ob/do/play/.tox/py27-hello/tmp
envlogdir = /home/ob/do/play/.tox/py27-hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest]
commands = [['/home/ob/do/play/.tox/py27-hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
[testenv:py37-hello]
envdir = /home/ob/do/play/.tox/py37-hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py37-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py37-hello'}
basepython = python3.7
description =
envtmpdir = /home/ob/do/play/.tox/py37-hello/tmp
envlogdir = /home/ob/do/play/.tox/py37-hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest, mock]
commands = [['/home/ob/do/play/.tox/py37-hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False
[testenv:hello]
envdir = /home/ob/do/play/.tox/hello
setenv = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/hello'}
basepython = /usr/bin/python
description =
envtmpdir = /home/ob/do/play/.tox/hello/tmp
envlogdir = /home/ob/do/play/.tox/hello/log
downloadcache = None
changedir = /home/ob/do/play
args_are_paths = True
skip_install = False
ignore_errors = False
recreate = False
passenv = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
whitelist_externals = []
platform = .*
sitepackages = False
alwayscopy = False
pip_pre = False
usedevelop = False
install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
list_dependencies_command = ['python', '-m', 'pip', 'freeze']
deps = [pytest, mock]
commands = [['/home/ob/do/play/.tox/hello/bin/python', '--version'], ['echo', 'hello']]
commands_pre = []
commands_post = []
ignore_outcome = False
extras = []
depends = ()
parallel_show_output = False