logo logo

September 04, 2021 03:08

パッケージ管理ソフトにおける注意点

パッケージ管理モジュールの基本

パッケージファイルとロックファイルの意味について

  • 通常様々なパッケージ管理ソフトには、パッケージファイルとロックファイルがセットになっている
    • ex1. bundleのGemfileとGemfile.lock
    • ex2. npmのpackage.jsonとpackage-lock.json
    • 蛇足だが、yarnではyarn.lockというロックファイルが生成される。npmとyarnでロックファイルが2つ生成されると、実行タイミングがずれたときなどに不整合を起こす場合があるため、複数パッケージ管理モジュールの運用は避けた方が無難
    • cf. ただしpipにはロックファイルは標準生成・管理されないらしい
    • pipとcondaの併用なんかも同様の不具合リスクが存在する

これらの基本的な対応関係は

  • パッケージファイルはブループリント(ここではインストールするパッケージのバージョンも指定できるが、すべてのパッケージで厳密なバージョン指定をする運用はかならずしもされない)
  • ロックファイルはスナップショット
    • なぜロックファイルが必要かというと、主にパッケージファイルを元にパッケージをインストールしても、実行タイミングなどでバージョンが異なるため(厳密なバージョン指定があればまだよいが、それでも依存関係まで完全に管理するのは困難)。 ロックファイルがないと、インストールのタイミングでアプリケーションのビルドやコンパイルが通らないなどのリスクがある
  • 基本的にパッケージ管理ソフトでinstallコマンドを実行すると、まずはロックファイルを確認し、そのバージョンでinstallが行われ、install済みであればupdateされることはない。ロックファイルに存在せず、パッケージファイルに存在するパッケージは新たにinstallされる
  • updateコマンドではまずはパッケージファイルを元にinstall/updateが実行され、終了後にロックファイルも更新する

bundle installとbundle updateの違い

  • bundle installではロックファイルを優先して、固定されていたらそれに従う
  • bundle updateではパッケージファイルを元にパッケージをインストール&アップデートして、その後ロックファイルを更新する

    • そのため、gemのアップデートが必要な場合などに実行する
  • bundle updateはアプリケーション動作に不具合を起こす可能性がある→基本的に本番環境で無暗に実行すべきではない

参考文献