tox-3.2.0 以降で usedevelop を指定しながら、deps に自身を指定するとハマる件

バグを踏み抜きました。

tox-3.2.0 以降で、次のような tox.ini を作っていると、テストを実行してもパッケージが更新されなくなります。

[testenv]
usedevelop = True
deps =
    .[extra]

具体的な条件としては

  • usedevelop を指定している
  • 自身を deps に extra 込みで指定している

のふたつです。

変更点を読み解いていくと、3.2.0 から deps のインストールコマンドが pip install から python -m pip に置き換わったのがきっかけのようです。この変更がなぜ問題を引き起こしているのかまでは追いかけきれませんでした。


この条件を満たすと、tox 内の virtualenv は次のような状況に陥ります。

  • 対象のコードは site-packages 以下にインストールされる
  • tox は usedevelop モードで動作するので、二度目以降は対象コードはインストールされない

そのため、この状態から抜け出すには --recreate (-r) をつけて、環境を作りなさなければなりません。

回避策は以下のいずれか。

1) deps に自身を書かない。extras を指定したい場合は tox.ini に extras 設定を追加する

[testenv]
usedevelop = True
extras = foo,bar,baz

2) install_command オプションに pip install を指定する (旧動作に戻す)

[testenv]
usedevelop = True
deps =
    .[extra]
install_command = pip install {opts} {packages}

3) tox-3.1.3 にバージョンを下げる


お使いの環境やプロジェクトに合わせて適切なものを選ぶと良いでしょう。
ちなみに 1) は tox-2.4 (2016-10-12) 以降向けです。

さて、Sphinx ではどうしようかしら。