はじめに
あなたはプログラムを構成するモジュールのバージョンを指定していますか?
私は(個人開発において)そこまで大きく意識をしていなかったのですが、最近になって「モジュールのバージョンは指定した方が良い」と実感する場面(エラー)に遭遇しました。
当たり前な内容になりますが、詳細な実例が頭にあると主観による「腑に落ちる」が進むと感じる次第です。
エラー内容に入る前に前提となる 環境説明 をしていきます。
環境説明
私が実験的に開発している LINE Bot(LINE Developers)に aimay があります。
大まかな構成は以下の通りです。
- プログラミング言語: Python3
- モジュールの管理: pip
- モジュールの最新バージョン検知: Dependabot
- Webアプリケーションフレームワーク: Flask
- ドキュメンテーションジェネレータ: Sphinx
- CI/CD: GitHub Actions
- PaaS: Heroku
話に必要な情報に絞って明示しました。より詳細を把握したい方は aimay#Development をご覧ください。
環境説明 - 補足
モジュールとそのバージョンを管理する「requirements.txt」を Dependabot が監視して最新バージョンを検知します。
モジュールの最新バージョンを検知すると Dependabot が「Pull Request」(「requirements.txt」を「commit」)を自動でくれます。
私はその「Pull Request」の内容を確認して「Pull Request」で作成された「branch」を「merge」しています。
「commit」をイベントに GitHub Actions が作動し Heroku へ「Deploy」されます。
ちなみに今回起きたエラーはこの GitHub Actions のログから発覚したものです。
どんなエラーが起きたのか
「requirements.txt」に記載がある2つのモジュールの依存モジュールにおいて、バージョンの「conflict」が発生しました。
...
The conflict is caused by:
sphinx 4.0.1 depends on Jinja2<3.0 and >=2.3
flask 2.0.0 depends on Jinja2>=3.0
To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict
...
記載の通りですが、以下の内容が書かれています。
Jinja2 のバージョンで「conflict」が発生しています。
エラーの原因と解決方法
本エラーの原因は以下の通りです。
本エラーの解決方法は以下の通りです。
- flask が Jinja2
3.0未満(且つ2.3以上)を依存モジュールとしていたバージョンまで下げる - エラーの解決を一旦放置しておき、sphinx が Jinja2
3.0以上に対応した後に sphinx のバージョンを上げる
エラーの原因の原因
- Dependabot による「
Pull Request」の内容確認が不足していた(「merge」するまでの流れ: 環境説明 - 補足)
余談
flask と Jinja2 の開発元は Armin Ronacher が率いる Pallets です。flask と sphinx の開発元は違うんですねぇ..。
現在では依存関係による問題を回避してくれるパッケージ管理ツールは沢山あると思いますので、このような細かな話はあまり気にならない時代なのかもしれません。
小休止
お疲れ様です。ここまでを夕方に読むと頭が痛くなるかもしれません。
エラーに忠実に、あえて回りくどく書いています。「心地良い 頭の体操」になると幸いです。
小休止 と言っても次で最後です。(オイッ)
モジュールのバージョンは指定した方が良い
エラーの原因の原因 の通り、形ではバージョン指定をしていましたが実態としては「常に最新を保つ」ようになっていました。
セキュリティの観点で言えば「常に最新を保つ」は正しいのかもしれませんが、安定した稼働を優先するのであれば少し面倒でも「モジュールのバージョンは指定した方が良い」のかもしれません。
✍️ 追記
> 常に最新を保つ
OSSの次バージョンにマルウェアが仕込まれる事件が目に付くようになってきました。
バージョンアップの度にソースの差分を追うわけにもいきませんし、性善説モデルの弱点を感じた次第です。
「バージョンは lock しておき、アップデートは慎重に・・、なるべく最新バージョンを保つ」が良さそうですね。