アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

Corodvaプラグインが原因でビルドが失敗するケースについて

こんにちは、MonacaチームでMonacaの安定運用のために、いろんな検証をしている小田川です。

Monacaでは、MonacaクラウドIDEをはじめ、たくさんのサービスが提供されています。

Monacaで開発したアプリをモバイル端末上で動作確認するためには、ビルドをしてインストール用のファイルを作成する必要があります。 そのため、Monacaが提供しているサービスの中で、リモートビルドサーバーは、非常に大きな役割を担っているサービスになります。

そんなビルドサーバーの検証の一つに、Cordovaプラグインが正常にビルドできるか というのがあります。

アプリの開発中は、ビルドをしてもビルドが失敗してしまうケースも多いと思います。

ビルドが失敗するケースの多くは、サードパーティー製Cordovaプラグインが関係しています。そのため、ビルドが失敗する原因がビルドサーバー側にあるのか、それともサードパーティー製Cordovaプラグイン側にあるのか、というようなことも日々検証しています。

今回は、Corodvaプラグインが原因でビルドが失敗するケースについて書いてみたいと思います。

requireCordovaModuleでビルドエラー

Monacaでは、2019年6月27日から Cordova 9.0 の提供を開始しました。

サードパーティー製Cordovaプラグインの中には、定期的にメンテナンスが行われていない場合も多いので、注意が必要です。

Cordova 9.0からは、Cordovaプラグインのビルドに関係する仕様変更が行われているため、Cordovaプラグイン側がCordova 9.0に対応していない場合は、ビルドエラーになります。

例として、下記のような requireCordovaModule のエラーが出力される場合は、対象のCordovaプラグインはCordova 9.0に対応していません。

この場合は、対象のCorodvaプラグインがCordova 9.0に対応するのを待つか、自分でCordovaプラグイン内の package.jsonJavaScript 等を改修する必要があります。

例1:

CordovaError: Using "requireCordovaModule" to load non-cordova module "q" is not supported. Instead, add this module to your dependencies and use regular "require" to load it.
例2:

CordovaError: Using "requireCordovaModule" to load non-cordova module "path" is not supported. Instead, add this module to your dependencies and use regular "require" to load it.

メンテナンス停止でビルドエラー

多くの開発者に利用されているサードパーティー製Cordovaプラグインは、定期的にメンテナンスされている場合が多いため、比較的安心して利用できるのですが、中には、突然メンテナンスが行われなくなるケースもあります。

これまで、Firebaseのプッシュ通知を利用する場合、

github.com

が多く利用されていたのですが、2019年6月にGoogleが提供しているライブラリーが更新された影響で、Androidビルドの際にビルドエラーが発生するようになりました。

cordova-plugin-firebaseプラグインは、現在も更新されていないため、ビルドエラーになります。

利用者が多いCordovaプラグインの場合は、GitHubのIssuesに報告が寄せられ、回避策等の回答を得ることができる場合が多いため、今まで利用できていたCordovaプラグインが突然利用できなくなった場合は、一度、Issusを確認することをお勧めします。

cordova-plugin-firebaseプラグインの場合は、その後、

github.com

github.com

に引き継がれて開発が行われていましたが、現在は、cordova-plugin-firebasexプラグインで開発が進められています。

cordova-plugin-firebasexプラグインは、Cordova 9.0以降から利用できます。

Cordova 7.1でcordova-plugin-firebaseプラグインを利用している場合は、対象のMonacaプロジェクトをCordova 9.0にアップグレードしてcordova-plugin-firebasexプラグインを利用する必要があります。

ライブラリーのバージョン競合でビルドエラー

Monacaプロジェクトに複数のCordovaプラグインを組み込んでいる場合、それぞれのCordovaプラグインで利用されているライブラリーのバージョンが競合するケースも多く見られます。

ライブラリーのバージョン競合は、主にAndroidビルドで発生します。

ライブラリーのバージョン競合を回避するために、Cordovaプラグイン側で variable 設定が提供されている場合があります。

利用者が多いCordovaプラグインの場合は、variable 設定が提供されている場合が多いので、ビルドの際にライブラリーのバージョン競合が発生した場合は、Cordovaプラグインのドキュメントにvariable設定の記載がないか確認することをお勧めします。

variable設定を確認してみよう

Cordovaプラグインでvariable設定ができる場合は、Cordovaプラグインのインストールパラメータとして指定することができます。

このvariable設定は、Cordovaプラグイン内にある plugin.xmlpreference タグとして設定されています。

ドキュメントにvariable設定の記載がない場合でも、一度、plugin.xmlにpreferenceタグが設定されていないか確認してみてください。意外と設定されていたりします。

cordova-plugin-firebasexプラグインのplugin.xmlには、以下のようなpreferenceタグが設定されています。

<!-- Default versions for Gradle dependencies -->
<preference name="ANDROID_PLAY_SERVICES_TAGMANAGER_VERSION" default="17.0.0" />
<preference name="ANDROID_FIREBASE_CORE_VERSION" default="17.0.0" />
<preference name="ANDROID_FIREBASE_MESSAGING_VERSION" default="19.0.0" />
<preference name="ANDROID_FIREBASE_CONFIG_VERSION" default="18.0.0" />
<preference name="ANDROID_FIREBASE_PERF_VERSION" default="18.0.0" />
<preference name="ANDROID_FIREBASE_AUTH_VERSION" default="18.0.0" />
<preference name="ANDROID_CRASHLYTICS_VERSION" default="2.10.1" />
<preference name="ANDROID_CRASHLYTICS_NDK_VERSION" default="2.1.0" />
<preference name="ANDROID_SHORTCUTBADGER_VERSION" default="1.1.22" />

<framework src="com.google.android.gms:play-services-tagmanager:$ANDROID_PLAY_SERVICES_TAGMANAGER_VERSION" />
<framework src="com.google.firebase:firebase-core:$ANDROID_FIREBASE_CORE_VERSION" />
<framework src="com.google.firebase:firebase-messaging:$ANDROID_FIREBASE_MESSAGING_VERSION" />
<framework src="com.google.firebase:firebase-config:$ANDROID_FIREBASE_CONFIG_VERSION" />
<framework src="com.google.firebase:firebase-perf:$ANDROID_FIREBASE_PERF_VERSION" />
<framework src="com.google.firebase:firebase-auth:$ANDROID_FIREBASE_AUTH_VERSION" />
<framework src="com.crashlytics.sdk.android:crashlytics:$ANDROID_CRASHLYTICS_VERSION" />
<framework src="com.crashlytics.sdk.android:crashlytics-ndk:$ANDROID_CRASHLYTICS_NDK_VERSION" />
<framework src="me.leolin:ShortcutBadger:$ANDROID_SHORTCUTBADGER_VERSION" />

Monacaでpreferenceタグに設定されているデフォルト値以外の設定を行いたい場合は、対象のCordovaプラグインの設定画面にある インストールパラメータ に、以下のように設定します。

f:id:keiji_asial:20190820074919p:plain
インストールパラメータ設定例

上の例では、値に 17.0.++ 設定をしています。

17.0.1 のような固定値を指定した場合は、固定値以外のバージョンが他のCordovaプラグインで設定されていた場合に競合してしまうため、バージョン競合を回避する場合は、通常 + 設定を行います。

中には、固定値のみ動作する場合があるため、その場合は他のCordovaプラグインでも対象の固定値に合わせる必要が出てきます。

利用するCordovaプラグインによってケースが異なるため、ライブラリーのバージョン競合が発生した場合は、利用しているCordovaプラグインに合わせて設定を行う必要があります。

インストールパラメータにvariable設定を行うことによって、ビルド時に設定を変更することができます。ライブラリーのバージョン競合が発生した場合は、一度、variable設定を確認してみてください。

variable設定ができない時は

Cordovaプラグインの中には、variable設定ができないものもあります。

その場合は、手動でplugin.xmlに設定されているバージョンの値を変更したCordovaプラグインを作成して利用することもできますが、以下のようなCordovaプラグインを利用することで、ライブラリーのバージョン指定を行うこともできます。

github.com github.com github.com

上記のようなCordovaプラグインを使用することで、バージョン競合を回避できるケースも多いのですが、Cordovaプラグイン側の設定によっては回避できない場合もあります。

その場合は、バージョン競合が発生しているCordovaプラグインのIssuesに回避策が報告されていないか確認してみてください。

さいごに

このような感じで、日々あちこち調べながら検証を行っています。

今回紹介したケース以外でも、Cordovaプラグインが原因でビルドが失敗するケースが色々とあります。回避策は、CordovaプラグインのドキュメントやIssuesに記載されている場合も多くありますので、Cordovaプラグインが原因でビルドが失敗する場合は、はじめにドキュメントやIssuesを確認することをお勧めします。

また、何か報告できるようなことがあれば、ブログに書いてみたいと思います。