Как запустить tox -e myenv для других сред? - PullRequest
2 голосов
/ 18 мая 2019

Возможно ли в tox иметь tox -e hello запуск среды приветствия и запуск в глобальном envlist?

Запуск tox работает правильно против py2 и py3.

Запуск tox -e hello работает только против py3.

[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 Ответ

2 голосов
/ 18 мая 2019

Здесь нужно понять две основные вещи:

  1. envlist - это глобальная настройка в разделе [tox]. Определение его в [testenv:hello] не имеет никакого эффекта
  2. envlist определяет или генерирует список env имен. Это можно сделать либо статически, предоставив простой список, разделенный запятыми, либо - как вы это сделали - сгенерировать список комбинаторно из факторов, предоставленных с помощью специального синтаксиса {...}. Результатом в обоих случаях является список имен сред, которые затем будут выполняться в отдельном virtualenvs / venvs.

Итак, чтобы было совершенно ясно: в конце envlist - это простой список env имен - больше ничего. То, что делается с этими именами (или их частями (a.k.a. factor )), происходит во время выполнения в envs.

Все эти среды выполняются, если вы вызываете tox без -e. В вашем примере вы генерируете список envlist с синтаксисом {<factorX>,<factorY>}, который основан на том же принципе, который предоставляется оболочками командной строки. Если вы запросите сгенерированные среды в вашей конфигурации tox, результат будет:

$ tox -a

py27-hello
py37-hello
hello

Это уже может показывать, что в вашей конфигурации что-то не так, потому что я не думаю, что вам нужен неквалифицированный hello env.

То, что вы делаете, генерируя envlist и статически предоставляя hello testenv с использованием синтаксиса [testenv:hello], смешивает их таким образом, что затем не дает желаемого результата.

Итак, давайте адаптируем ваш 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 содержит определенный фактор ( которые являются именными частями, разделенными -) генерирует список имен сред, которые затем служат информацией для конкретных выполняемых сред.

Если я позвоню tox -a снова на измененном ini, я получу:

py27-hello
py37-hello

Теперь я могу запросить полный набор или только факторы, позвонив, например, tox -e py27-hello или даже tox -e hello, которые затем будут использовать базовый Python и делать все, что соответствует коэффициенту.

Чтобы получить более полное представление о происходящем, вы можете отобразить полностью разрешенную конфигурацию для всех сред, которая выглядит примерно так:

$ 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
...