如何 运行 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 吗?考虑到其他一切都与毒性有关的灵活性和重用导向,这似乎非常笨拙。我觉得我错过了什么。

这里主要理解两点:

  1. envlist[tox] 部分中的 global setting。在[testenv:hello]中定义它没有效果
  2. envlist 定义或生成 env 名称列表。这可以通过提供一个简单的逗号分隔列表来静态完成,或者 - 就像你所做的那样 - 从通过特殊语法 {...} 提供的因素组合生成列表。 both 情况下的结果是一个环境名称列表,然后将在 virtualenvs / venvs.
  3. 中执行

所以要说得非常清楚:最后 envlistenv 名称的简单列表 - 没有别的。在 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