通过Cordova中的build-extras.gradle将自定义值添加到build.gradle文件

时间:2018-08-07 09:17:23

标签: android cordova gradle android-gradle build.gradle

我已将cordova-android版本更新为6.4.0,在此之前我已安装5.1.1。这里的问题是,在更新到6.4.0版本时,在构建项目时出现错误。因此,要克服该问题,我必须添加以下代码

configurations.all {
        resolutionStrategy {
            force 'com.android.support:support-v4:27.1.0'
        }
}

现在的问题是,每次构建项目时,我都必须编辑build.gradle文件,该文件是在将平台添加到Cordova中的项目时生成的。由于这不是源代码管理的一部分。

为了克服这个问题,我使用了post中的解决方案。在这里,我要添加Javascript文件,并在config.xml中添加钩子

Java脚本文件

var fs = require('fs');
var rootdir = process.argv[2];

var android_dir = rootdir + '/platforms/android';
var gradle_file = rootdir + '/build-extras.gradle';
var dest_gradle_file = android_dir + '/build-extras.gradle';

if (fs.existsSync(android_dir) && fs.existsSync(gradle_file)) {
    console.log('Copy ' + gradle_file + ' to ' + android_dir); 
    fs.createReadStream(gradle_file).pipe(fs.createWriteStream (dest_gradle_file));
} else {
    console.log(gradle_file + ' not found. Skipping');
}

Build-extras.gradle

ext.postBuildExtras = {
android {
configurations.all {
        resolutionStrategy {
            force 'com.android.support:support-v4:27.1.0'
         }
      }
   }
}

钩入Config.xml

<platform name="android">
    <hook src="scripts/buildGradleHook.js" type="before_build" />
</platform>

添加的挂钩未反映在生成的android文件夹中。那是build-extras.gradle文件没有反映在android文件夹中。

1 个答案:

答案 0 :(得分:1)

我尝试了您的解决方案,发现声明用来定义不同路径的vars错误。

我为此更改了挂钩代码:

module.exports = function(ctx) {
    var fs = ctx.requireCordovaModule('fs'),
    path = ctx.requireCordovaModule('path'),
    rootdir = ctx.opts.projectRoot,
    android_dir = path.join(ctx.opts.projectRoot, 'platforms/android');
    gradle_file = rootdir + '/build-extras.gradle';
    dest_gradle_file = android_dir + '/build-extras.gradle';

    /*
    console.log("Before-Build Hook - rootdir", rootdir);
    console.log("Before-Build Hook - android_dir", android_dir);
    console.log("Before-Build Hook - gradle_file", gradle_file);
    console.log("Before-Build Hook - dest_gradle_file", dest_gradle_file);
    */

    if(!fs.existsSync(gradle_file)){
        console.log(gradle_file + ' not found. Skipping');
        return;
    }else if(!fs.existsSync(android_dir)){
        console.log(android_dir + ' not found. Skipping');
       return;
    }

    console.log('Copy ' + gradle_file + ' to ' + android_dir);
    fs.createReadStream(gradle_file).pipe(fs.createWriteStream(dest_gradle_file));
}

此外,在Hook文档中说它必须是可执行文件,因此需要用“ module.exports = function(ctx){}”包装。