在 virtualenv 中安装依赖项后 运行 命令的推荐方法

Recommended way to run commands after installing dependencies in the virtualenv

我想在需要额外设置的项目上使用 tox 到 运行 py.test除了将软件包安装到 virtualenv 中。创建 virtualenv 并安装依赖项后,一些命令需要 运行.

具体来说,我说的是使用 nodeenv:

设置 nodenpm 环境
nodeenv --prebuilt -p

我看到 tox 允许我通过在 tox.ini 中设置 install_command 来提供用于安装依赖项的自定义命令。但我不认为这是我想要的,因为 替换了 用于安装依赖项的命令(我假设 pip)。

我考虑过使用具有 session 范围的 py.test fixture 来处理 nodeenv 的设置,但这对我来说似乎很老套,因为我不希望这种情况发生py.test 是直接 运行,而不是通过 tox。

实现此目标最简单的方法是什么?

commands 中创建 virtualenv 和依赖安装后,您可以进行所有必要的设置。是的,它显示 "the commands to be called for testing.",但如果您需要做额外的工作来准备测试,您可以直接在此处完成。

无论你按给定的顺序扔给它什么,它都会起作用——例如:

  [testenv:someenv]
  deps = 
    nodeenv
    pytest
    flexmock
  commands =
     nodeenv --prebuilt -p
     ; ... and whatever else you might need to do
     py.test path/to/my/tests

如果你有 commands/scripts 或任何其他产生正确结果的东西,但它 returns 一个非零退出状态,你可以通过在 - 前面加上忽略它(如 - naughty-command).

如果您需要执行更多步骤,您可以将它们包装在一个小 (Python) 脚本中,然后按照 .

中所述调用该脚本

添加使用多个安装命令的能力也存在问题:https://github.com/tox-dev/tox/issues/715 已实现。

我遇到了同样的问题,因为能够在不调用测试的情况下创建环境(通过 --notest)对我来说很重要,所以我希望安装在安装阶段进行,而不是运行 阶段,所以我做了一些稍微不同的事情。首先,我创建了一个 create-env 脚本:

#!/usr/bin/env sh

set -e

pip install $@
nodeenv --prebuilt --python-virtualenv --node=8.2.1

使其可执行,然后在 tox.ini:

[tox]
skipsdist = True

[testenv]
install_command = ./create-env {opts} {packages}
deps = nodeenv
commands = node --version

此完整示例 运行s 并输出以下内容:

$ tox
python create: .../.tox/python
python installdeps: nodeenv
python installed: nodeenv==1.3.0
python runtests: PYTHONHASHSEED='1150209523'
python runtests: commands[0] | node --version
v8.2.1
_____________________________________________________________________ summary ______________________________________________________________________
  python: commands succeeded
  congratulations :)

这种方法的缺点是它只能在 Unix 上工作。

tox 715中,我提出了本机支持多个安装命令的可能性。