suna/モジュールのバージョンは指定した方が良い

Created Tue, 31 Aug 2021 21:50:35 +0900 Modified Tue, 04 Oct 2022 01:39:33 +0000
1689 Words

はじめに

あなたは、プログラムを構成するモジュールのバージョンを指定していますか?

私は (個人開発において) そこまで大きく意識をしていなかったのですが、
最近になって モジュールのバージョンは指定した方が良い と実感する場面(エラー)に遭遇しました。

当たり前な内容になりますが、
詳細な実例が頭にあると 主観による腑に落ちるが進むと感じる次第です。

エラー内容に入る前に、前提となる環境説明をしていきます。

環境説明

私が実験的に開発しているLINE Bot(LINE Developers)に aimay があります。

大まかな構成は、以下の通りです。

  • プログラミング言語: Python3
  • モジュールの管理: pip
  • モジュールの最新バージョン検知: Dependabot
  • Webアプリケーションフレームワーク: Flask
  • ドキュメンテーションジェネレータ: Sphinx
  • CI/CD: GitHub Actions
  • PaaS: Heroku

話に必要な情報に絞って明示しました。
より詳細を把握したい方は aimay#Development をご覧ください。

環境説明 - 補足

モジュールとそのバージョンを管理するrequirements.txtDependabotが監視して 最新バージョンを検知します。
モジュールの最新バージョンを検知すると、DependabotPull Request(requirements.txtcommit)を自動でくれます。
私はそのPull Requestの内容を確認して、Pull Requestで作成されたbranchmergeしています。

commitをイベントに GitHub Actionsが作動し、HerokuDeployされます。
ちなみに 今回起きたエラーは、この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が発生しています。

エラーの原因と解決方法

本エラーの原因は、以下の通りです。

  • requestment.txtsphinx, flaskのバージョン指定

本エラーの解決方法は、以下の通りです。

  • flaskJinja2 3.0未満(且つ 2.3以上) を依存モジュールとしていたバージョンまで下げる
  • エラーの解決を一旦放置しておき、sphinxJinja2 3.0以上に対応した後に sphinxのバージョンを上げる

エラーの原因の原因

余談

flaskJinja2の開発元は、Armin Ronacherが率いるPalletsです。
flasksphinxの開発元は違うんですねぇ..。
現在では 依存関係による問題を回避してくれるパッケージ管理ツールは沢山あると思いますので、このような細かな話は あまり気にならない時代なのかもしれません。

小休止

お疲れ様です。
ここまで 夕方に読むと頭が痛くなるかもしれません。
エラーに忠実に あえて回りくどく書いています。
心地良い 頭の体操になると幸いです。
小休止と言っても 次で最後です。(オイッ)

モジュールのバージョンは指定した方が良い

エラーの原因の原因の通り、形ではバージョン指定をしていましたが、実態としては常に最新を保つようになっていました。
セキュリティの観点で言えば常に最新を保つは正しいのかもしれませんが、安定した稼働を優先するのであれば、少し面倒でもモジュールのバージョンは指定した方が良いのかもしれません。

✍️ 追記
> 常に最新を保つ
OSSの次バージョンにマルウェアが仕込まれる事件が目に付くようになってきました。
バージョンアップの度に ソースの差分を追うわけにもいきませんし、性善説モデルの弱点を感じた次第です。
「バージョンは lock しておき、アップデートは慎重に・・、なるべく最新バージョンを保つ」が良さそうですね。