使用 Cordova 构建时定义 Android Gradle 插件版本
Define Android Gradle Plugin Version when Building with Cordova
使用 Cordova 构建我的 Android 项目时,在 Android Studio 中打开时收到以下消息:
我的 build.gradle 文件反映了插件差异(尽管定义的 Gradle 版本是正确的):
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
}
我想知道是否有办法配置 Cordova 以显式定义 Android Gradle 插件版本。
Android Gradle 插件版本为 hard-coded into the build.gradle
template in cordova-android.
如果您从 master 分支安装平台,您可以看到它使用的版本 (3.2.0
) 高于最新的 npm 版本 cordova-android@7.1.4
,即 configured for 3.0.1
。
直接从master分支安装:
cordova platform add https://github.com/apache/cordova-android
如果你想使用最新版本,你可以 fork cordova-android
repo,在 build.gradle
模板中固定你想要的版本,然后直接从你的 forked repo 安装插件:
cordova platform add https://github.com/my_github_username/cordova-android
我遇到了一个问题,需要在 platforms/android/build.gradle
文件中指定替代版本的 gradle 插件,而不是默认的 Cordova android 构建生成的版本。因此,为了修复它,我在 after_platform_add
上创建了一个指向 运行 的 Cordova 挂钩脚本,它修改了 gradle 插件版本。
详情
Cordova 9 构建正在生成一个 build.gradle
文件,其中包含以下 gradle 插件版本 3.3.0 依赖项:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.android.tools.build:gradle:3.3.0'
}
}
但是,我需要插件的 3.3.3
版本。
- 在 Cordova
config.xml
文件中,我在我的 android 平台部分添加了这个钩子:
<platform name="android">
<hook type="after_platform_add" src="hooks/android/modify-android-gradle-plugin-version.js" />
...
</platform>
- 然后我添加了这个
modify-android-gradle-plugin-version.js
钩子脚本。 (请原谅我的javascript不完善,我不是js专家。)
const fs = require('fs');
const path = require('path');
const deferral = require('q').defer();
const async = require('async');
module.exports = function(ctx) {
console.log('Running modify-android-gradle-plugin-version.js...');
const platformRoot = path.join(ctx.opts.projectRoot, 'platforms/android');
const gradleFiles = [path.join(platformRoot, 'build.gradle')];
async.each(gradleFiles, function(f, cb) {
fs.readFile(f, 'utf8', function(err, data) {
if (err) {
cb(err);
return;
}
// regex to replace version 3.3.0 with version 3.3.3
const result = data.replace(/com\.android\.tools\.build:gradle:3\.3\.0/g, 'com.android.tools.build:gradle:3.3.3');
fs.writeFile(f, result, 'utf8', cb);
});
}, function(err) {
if (err) {
deferral.reject();
} else {
deferral.resolve();
}
});
return deferral.promise;
}
- 我还必须将
async
节点模块添加到我的 cordova 项目 package.json
: 的 devDependencies
部分
"devDependencies": {
"async": "3.2.2"
}
使用 Cordova 构建我的 Android 项目时,在 Android Studio 中打开时收到以下消息:
我的 build.gradle 文件反映了插件差异(尽管定义的 Gradle 版本是正确的):
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
}
我想知道是否有办法配置 Cordova 以显式定义 Android Gradle 插件版本。
Android Gradle 插件版本为 hard-coded into the build.gradle
template in cordova-android.
如果您从 master 分支安装平台,您可以看到它使用的版本 (3.2.0
) 高于最新的 npm 版本 cordova-android@7.1.4
,即 configured for 3.0.1
。
直接从master分支安装:
cordova platform add https://github.com/apache/cordova-android
如果你想使用最新版本,你可以 fork cordova-android
repo,在 build.gradle
模板中固定你想要的版本,然后直接从你的 forked repo 安装插件:
cordova platform add https://github.com/my_github_username/cordova-android
我遇到了一个问题,需要在 platforms/android/build.gradle
文件中指定替代版本的 gradle 插件,而不是默认的 Cordova android 构建生成的版本。因此,为了修复它,我在 after_platform_add
上创建了一个指向 运行 的 Cordova 挂钩脚本,它修改了 gradle 插件版本。
详情
Cordova 9 构建正在生成一个 build.gradle
文件,其中包含以下 gradle 插件版本 3.3.0 依赖项:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.android.tools.build:gradle:3.3.0'
}
}
但是,我需要插件的 3.3.3
版本。
- 在 Cordova
config.xml
文件中,我在我的 android 平台部分添加了这个钩子:
<platform name="android">
<hook type="after_platform_add" src="hooks/android/modify-android-gradle-plugin-version.js" />
...
</platform>
- 然后我添加了这个
modify-android-gradle-plugin-version.js
钩子脚本。 (请原谅我的javascript不完善,我不是js专家。)
const fs = require('fs');
const path = require('path');
const deferral = require('q').defer();
const async = require('async');
module.exports = function(ctx) {
console.log('Running modify-android-gradle-plugin-version.js...');
const platformRoot = path.join(ctx.opts.projectRoot, 'platforms/android');
const gradleFiles = [path.join(platformRoot, 'build.gradle')];
async.each(gradleFiles, function(f, cb) {
fs.readFile(f, 'utf8', function(err, data) {
if (err) {
cb(err);
return;
}
// regex to replace version 3.3.0 with version 3.3.3
const result = data.replace(/com\.android\.tools\.build:gradle:3\.3\.0/g, 'com.android.tools.build:gradle:3.3.3');
fs.writeFile(f, result, 'utf8', cb);
});
}, function(err) {
if (err) {
deferral.reject();
} else {
deferral.resolve();
}
});
return deferral.promise;
}
- 我还必须将
async
节点模块添加到我的 cordova 项目package.json
: 的
devDependencies
部分
"devDependencies": {
"async": "3.2.2"
}