Flutterでプロジェクト名と追加パッケージの名前が同じ場合、エラー「A package may not list itself as a dependency.」になる原因と対策。

パッケージ選定のために使い捨てのプロジェクトを作って試す際、プロジェクト名とパッケージ名を同じ名前で作ってしまったときにハマりました。

あまりないケースかもしれませんが、私はまたやってしまいそうなので自戒を込めて記事を残すことにしました。

再現手順

Flutterプロジェクト「shared_preferences」を作ります。
これは普通に正常起動します。

>flutter create shared_preferences
>cd shared_preferences
>flutter run # 正常に起動する

次にpubspec.yamlに「shared_preferences」パッケージを追加します。

# pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2
  shared_preferences: ^2.0.5 #これを追加

そして、パッケージを取得するため、「flutter pub get」するとエラーになります。

>flutter pub get # パッケージ取得
Error on line 27, column 3 of pubspec.yaml: A package may not list itself as a dependency.
   ╷                                                                    
27 │   shared_preferences: ^2.0.5                                       
   │   ^^^^^^^^^^^^^^^^^^                                               
   ╵                                                                    
Running "flutter pub get" in shared_preferences...                      
pub get failed (65;    ╵)

原因は、プロジェクト名と追加パッケージ名のバッティングであることがわかりました。

プロジェクト名はそのままパッケージ名になるため、その名前と追加パッケージの名前が重複するとエラーになるということのようです。

実際、プロジェクト内のdartファイルを読み込む場合、「import ‘package:{project_name}/foo_bar.dart’;」と書けることからも、{project_name}とパッケージ名が重複するとまずいことはわかります。

今回の例で言うと、「import ‘package:shared_preferences/shared_preferences.dart’」と書いた場合に「shared_preferences」がプロジェクト名かパッケージ名かどっちのことか分からなくなります。

それならと思い、ディレクトリ名を「shared_preferences_test」にリネームして試してみるもエラーになりました。

>cd ..
>mv shared_preferences shared_preferences_test
>cd shared_preferences_test 
>flutter pub get                              
Error on line 27, column 3 of pubspec.yaml: A package may not list itself as a dependency.
   ╷                                                                    
27 │   shared_preferences: ^2.0.5                                       
   │   ^^^^^^^^^^^^^^^^^^                                               
   ╵                                                                    
Running "flutter pub get" in shared_preferences_test...                 
pub get failed (65;    ╵)

なぜだと思って、よくよくpubspec.yamlを見ると、冒頭に以下の記述を発見。
プロジェクト名が埋め込まれています。

# pubspec.yaml
name: shared_preferences # ここにプロジェクト名が入っている!
description: A new Flutter project.

なので、ここもディレクトリ名と同じ「shared_preferences_test」に変更。

name: shared_preferences_test # ここを変更
description: A new Flutter project.

結果、「pub get」が成功して、無事正常起動しました。

>flutter pub get
>Running "flutter pub get" in shared_preferences_test...            12.7s
>flutter run # 正常に起動する

まとめ

使い捨てプロジェクトであっても、プロジェクト名は ユニーク性を持つようにつけるべしとの教訓を得ました。

小ネタではありますが遭遇したときに結構見慣れないエラーがでてビックリするので、誰かの役にたてば幸いです。

最後に宣伝です。
個人開発でアプリ作ってます。インストールしてもらえると嬉しいです。

コメント

タイトルとURLをコピーしました