【发布时间】:2016-12-07 21:46:50
【问题描述】:
我正在为具有 Gradle 依赖项的 android 编写 Cordova 插件。 我希望开发人员能够在不直接编辑插件的情况下指定他们想要的依赖版本。
现在我的 plugin.xml 中有这个:
<hook type="before_plugin_install" src="modifyPluginXML.js" />
<framework src="resources/custom.gradle" custom="true" type="gradleReference"/>
<framework src="$TO_BE_DEFINED_PACKAGE" type="gradleReference"/>
我有一个钩子,它接受命令行参数并将 plugin.xml 中的 $TO_BE_DEFINED_PACKAGE 替换为参数中提供的包路径/名称。
这里是 modifyPluginXML.js 钩子:
module.exports = function(context) {
var Q = context.requireCordovaModule('q');
var deferral = new Q.defer();
var fs = require('fs'),
xml2js = require('xml2js'),
path = require('path'),
util = require('util');
var parser = new xml2js.Parser({explicitArray:false});
var cb = function(data){
console.log("plugin.xml updated");
deferral.resolve();
}
fs.readFile(__dirname + '/plugin.xml', function(err, data) {
parser.parseString(data, function (err, result) {
//console.log(util.inspect(result, false, null));
var externalDep = "";
for (var i = 0; i < process.argv.length;i++){
if(process.argv[i].indexOf('EXTERNAL_DEP') >= 0){
externalDep = process.argv[i].replace("EXTERNAL_DEP=", "");
console.log(externalDep);
}
}
result.plugin.platform.framework[1]['$'].src = externalDep;
var builder = new xml2js.Builder();
var xml = builder.buildObject(result);
var filepath = path.normalize(path.join(__dirname, '/plugin.xml'));
fs.writeFile(filepath, xml, cb);
});
});
return deferral.promise;
}
到目前为止,如果您使用cordova plugin add plugin-name EXTERNAL_DEP=5.0 添加插件,它将正确地将plugin.xml 中的框架src 替换为命令行参数中指定的源。
我遇到的问题是cordova 似乎并不关心新的plugin.xml。它仍然使用旧的 plugin.xml 的框架标签。
在生成 build.gradle 文件中我仍然看到:
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
// SUB-PROJECT DEPENDENCIES START
debugCompile project(path: "CordovaLib", configuration: "debug")
releaseCompile project(path: "CordovaLib", configuration: "release")
compile "$TO_BE_DEFINED_PACKAGE"
// SUB-PROJECT DEPENDENCIES END
}
因此,即使 plugin.xml 使用 before_plugin_install 挂钩正确更新,cordova 仍使用旧值生成 build.gradle 文件。
有人有什么建议,或者我可以采取不同的路线吗?
【问题讨论】:
标签: android xml cordova gradle cordova-plugins