📚

poetryでansible-lintを管理する

2023/02/11に公開

poetryによるパッケージ管理

ansibleやansible-lintをpoetryでパッケージ管理したい。

具体的には以下のような pyproject.tomlになる

...
[tool.poetry.dependencies]
python = "^3.9"
ansible-core = "^2.13"

[tool.poetry.dev-dependencies]
ansible-lint = "^6.11.0"
...

インストールエラー

しかし、上記のような pyproject.tomlで poetry installするとエラーになる。
以下のようなLinux環境だが、will-not-work-on-windows-try-from-wsl-instead というパッケージの解決でエラーになっている。poetry install ではなく、poetry addなどで直接パッケージを追加しようとしてもダメ。

# 実行環境
OS: Ubuntu 22.04
poetry: 1.3.2
python: 3.9.13
$ poetry install
Updating dependencies
Resolving dependencies... (1.0s)

Because no versions of ansible-lint match >6.11.0,<6.12.0 || >6.12.0,<6.12.1 || >6.12.1,<6.12.2 || >6.12.2,<7.0.0
 and ansible-lint (6.11.0) depends on will-not-work-on-windows-try-from-wsl-instead (*), ansible-lint (>=6.11.0,<6.12.0 || >6.12.0,<6.12.1 || >6.12.1,<6.12.2 || >6.12.2,<7.0.0) requires will-not-work-on-windows-try-from-wsl-instead (*).
And because ansible-lint (6.12.0) depends on will-not-work-on-windows-try-from-wsl-instead (*), ansible-lint (>=6.11.0,<6.12.1 || >6.12.1,<6.12.2 || >6.12.2,<7.0.0) requires will-not-work-on-windows-try-from-wsl-instead (*).
And because ansible-lint (6.12.1) depends on will-not-work-on-windows-try-from-wsl-instead (*)
 and ansible-lint (6.12.2) depends on will-not-work-on-windows-try-from-wsl-instead (*), ansible-lint (>=6.11.0,<7.0.0) requires will-not-work-on-windows-try-from-wsl-instead (*).
So, because no versions of will-not-work-on-windows-try-from-wsl-instead match *
 and ansible-roles depends on ansible-lint (^6.11.0), version solving failed.

このwill-not-work-on-windows-try-from-wsl-insteadパッケージはダミーパッケージで、サポートされていないwindowns環境下でインストールしようとしたときにエラーになることを期待している。
pypiを見るとyankedとなっており、任意のバージョンが解決できないことでインストールエラーとなる仕組みらしい。

https://github.com/ansible/ansible-lint/pull/2712

https://pypi.org/project/will-not-work-on-windows-try-from-wsl-instead/

https://github.com/ansible/ansible-lint/blob/ea887d86dedc31f8c49804a5b10d4af948ff3499/.config/requirements.in#L2

しかし、poetryでは汎用的なlockファイルを生成するために、Linux環境でもWindowsの依存関係も含めて解決しようとする。このため、Linux環境下でもエラーになる。
残念ながら、ansible-lintはpoetryの不具合なので対応しない、poetryはansible-lintの実装方法が特殊なので対応しない、という立場を示しており解決される見込みがない。

https://github.com/ansible/ansible-lint/issues/2730

https://github.com/python-poetry/poetry/issues/7112

対策

Environment Markerを指定して対応する。
このときのpyproject.tomlは以下の通り

[tool.poetry.dependencies]
python = "^3.9"
ansible-core = "^2.13"

[tool.poetry.dev-dependencies]
ansible-lint = { version = "^6.11.0", markers = "platform_system != 'Windows'" }

Discussion