📚
poetryでansible-lintを管理する
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となっており、任意のバージョンが解決できないことでインストールエラーとなる仕組みらしい。
しかし、poetryでは汎用的なlockファイルを生成するために、Linux環境でもWindowsの依存関係も含めて解決しようとする。このため、Linux環境下でもエラーになる。
残念ながら、ansible-lintはpoetryの不具合なので対応しない、poetryはansible-lintの実装方法が特殊なので対応しない、という立場を示しており解決される見込みがない。
対策
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