pubspec.lockについて

pubspec.lockって前から何のためにあるのか不思議でした。
普段開くことがないからです。
そんな「pubspec.lock」について説明します!

目次

pubspec.yaml 対 pubspec.lock

pubspec.yamlを編集した時

dependencies:
  http: ^1.1.0
  #     ↑ 「1.1.0以上、2.0.0未満ならOK」という指定

実は曖昧な指定!


pubspec.lock(Flutterが自動生成)
正確な指定になる

packages:
  http:
    dependency: "direct main"
    description:
      name: http
      url: "https://pub.dartlang.org"
    source: hosted
    version: "1.1.2"
    #       ↑ 正確なバージョン!

🎯 なぜ必要なのか?

問題:pubspec.yaml だけでは不十分
例えば:

# 自分のpubspec.yaml
dependencies:
  http: ^1.1.0  # 1.1.0以上ならOK

3人の開発者の例
田中さん(2024年1月に開発)

flutter pub get
# → http 1.1.0 がインストールされる

鈴木さん(2024年6月に開発)

flutter pub get
# → http 1.1.5 がインストールされる(最新版)

鈴木さん(2024年6月に開発)

flutter pub get
# → http 1.2.0 がインストールされる(さらに最新)
問題発生!
田中さん:「アプリが動く!」
鈴木さん:「アプリが動く!」
佐藤さん:「エラーが出る!なんで?」

同じコードなのに、違うバージョンのパッケージ!

💡 解決策:pubspec.lock

pubspec.lock があると…

# pubspec.lock(みんな同じファイル)
packages:
  http:
    version: "1.1.2"  # 正確なバージョン

全員が同じバージョンを使える!

🔄 実際の動作

① 最初にパッケージを追加

# 自分(開発者)がパッケージ追加
flutter pub add http

Flutterがやること:

pubspec.yaml に追記

http: ^1.1.0
最新の互換バージョンをダウンロード

http 1.1.2 をインストール

pubspec.lock に記録

http:
version: “1.1.2”

② 他の開発者がプロジェクトを取得

チームメイトがコードをクローン
git clone your-project

パッケージ取得
flutter pub get

Flutterがやること:

  1. pubspec.lock を読む
  2. 正確なバージョン(1.1.2)をインストール
  3. 全員が同じバージョン!

🔍 pubspec.lock を見てみよう

📂 実際のファイル構造

concert_manager_app/
├── pubspec.yaml       ← 編集
├── pubspec.lock       ← Flutterが自動生成(編集しない)
├── lib/
└── ...

pubspec.lock実際の中身(一部):

packages:
  http:
    dependency: "direct main"
    description:
      name: http
      url: "https://pub.dartlang.org"
    source: hosted
    version: "1.1.2"
    
  shared_preferences:
    dependency: "direct main"
    description:
      name: shared_preferences
      url: "https://pub.dartlang.org"
    source: hosted
    version: "2.2.3"
    
  # 依存パッケージの依存パッケージも記録される
  path:
    dependency: transitive  # 間接的な依存
    description:
      name: path
      url: "https://pub.dartlang.org"
    source: hosted
    version: "1.8.3"

🎭 比喩で理解

料理の例

pubspec.yaml = ざっくりレシピ

材料:
- 小麦粉(適量)
- 砂糖(少々)
- 卵(新鮮なもの)

曖昧!人によって量が違う!


pubspec.lock = 正確なレシピ

材料:
- 小麦粉(200g、日清製粉株式会社、2024年製造)
- 砂糖(50g、三井製糖株式会社、ロット番号ABC123)
- 卵(3個、サイズM、賞味期限2024/12/20)

⚠️ 重要なルール

❌ やってはいけないこと・・pubspec.lock を手動で編集する
✅ やるべきこと・・pubspec.lock をGitに含める

# pubspec.lock をGitに含める
git add pubspec.lock
git commit -m "パッケージ追加"
git push

🔄 更新の流れ

パッケージを最新に更新したい場合

bash
# ① 更新
flutter pub upgrade

# ② pubspec.lock が自動更新される
# http: 1.1.2 → 1.2.0

# ③ テスト
flutter test

# ④ 問題なければコミット
git add pubspec.lock
git commit -m "パッケージ更新: http 1.1.2 → 1.2.0"

🎯 まとめ

pubspec.lock とは?

Flutterが自動生成する
「正確なパッケージバージョン記録ファイル」

なぜ必要?

✅ 全員が同じバージョンを使える
✅ 「俺の環境では動くけど?」を防ぐ
✅ ビルドの再現性を保証

どう扱う?

“`
✅ 編集しない(Flutterに任せる)
✅ Gitに含める(チーム共有)
✅ 削除しない(重要なファイル)

📊 役割の違い

ファイル役割編集
pubspec.yaml「このくらいのバージョンで」✅ 開発者が編集
pubspec.lock「このバージョンで確定」❌ Flutterが管理

💡 実際の例

pubspec.yaml「これくらいのバージョンでお願い」

dependencies:
  flutter:
    sdk: flutter
  http: ^1.1.0
  shared_preferences: ^2.2.2
  image_picker: ^1.0.5

pubspec.lock(Flutterが生成)「この正確なバージョンで動作確認済み」

packages:
  http:
    version: "1.1.2"
  shared_preferences:
    version: "2.2.3"
  image_picker:
    version: "1.0.7"
  # さらに、これらのパッケージが依存する
  # 他のパッケージも全て記録される

🌟 最後に

pubspec.lock は「縁の下の力持ち」

あなた:pubspec.yaml を編集

Flutter:pubspec.lock を更新

チームメイト:同じ環境を再現

みんな:同じように動作!

目次