今回の背景
Flutterで自作したアプリの Android Gradle Plugin (AGP) を最新のバージョンに更新しようと思い、7.x.x から 8.x.x にアップデートしました。すると、使用しているパッケージのsound_mode
にて以下のエラーが発生し、アプリのビルドが通らなくなりました。
Namespace not specified. Specify a namespace in the module's build file:
自分のアプリ内でビルドエラーが発生している場合、通常は build.gradle に namespace を追加することで解決できます。しかし、今回のケースではパッケージ側のソースコードまで遡って修正する必要がありました。
android {
namespace 'com.example.myapplication'
}
sound_mode
パッケージは、pub.devで確認したところ8ヶ月以上更新がされておらず、こちらの対応が行われていません。代替できそうなライブラリが無かったこともあり、今回はパッケージ側のソースコードを自分で修正しました。
この記事では、他パッケージでも応用可能な知見として手順をご紹介します。
パッケージ側のソースコードを修正する
まず、修正したいパッケージのGitHubリポジトリに移動し、forkします。1
次に、forkしたリポジトリをローカル環境にclone & 実行し、修正を行います。
(今回の場合は、android/build.gradle
にnamespace
を追加しています)
変更をcommit & pushします。また、forkしたリポジトリのURLをコピーしておきます。
最後に、pubspec.yaml
を以下のように置き換えます。url
には先ほどコピーしたGitHubのリポジトリのURLを貼り付けます。
- sound_mode: ^3.0.0
sound_mode:
git:
url: https://github.com/sakusaku3939/sound_mode.git
以上の手順により、自分でカスタマイズしたパッケージを使用することができるようになります。url
の下にref
を置くことで、対象のブランチ名やコミットIDを指定することも可能です。
また、forkした後の変更点はそのままプルリクエストとして投げる事が可能なので、余裕があればOSSのコントリビューターとしてぜひ貢献してみましょう。もし開発が放置されていてmergeが行われない場合でも、他のユーザーがプルリクエストのfork先URLをpubspec.yaml
に指定して利用できるようになります。
あとがき
書きながら調べていたところ、今回のパッケージ側のnamespace問題はbuild.gradle
に以下のコードを追加することで解決できたようです。。下調べが足りない
subprojects {
afterEvaluate { project ->
if (project.hasProperty('android')) {
project.android {
if (namespace == null) {
namespace project.group
}
}
}
}
}
-
git clone
をした後に自分のリポジトリに上げることでも同様に可能 ↩