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がやること:
- pubspec.lock を読む
- 正確なバージョン(1.1.2)をインストール
- 全員が同じバージョン!
🔍 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 を更新
↓
チームメイト:同じ環境を再現
↓
みんな:同じように動作!
