Я пишу плагин Cordova для Android, у которого есть зависимость от Gradle. Я хочу, чтобы разработчики могли указать, какую версию зависимости они хотят, без прямого редактирования плагина.Позволяет пользователю указывать зависимость Gradle для плагина 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"/>
и у меня есть крюк, который принимает аргумент командной строки и заменяет $ TO_BE_DEFINED_PACKAGE в plugin.xml с пакетом путем/именем, указанным в Аргумент.
Вот 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
он будет правильно заменить рамочный SRC в plugin.xml с источником, указанным в командной строке аргумент.
Проблема, с которой я сталкиваюсь, заключается в том, что кордова, похоже, не заботится о новом 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 файл.
Есть ли у кого-нибудь предложения или разные маршруты, которые я мог бы взять?
* и при этом вы почти всегда хотите иметь последнюю версию. Вы знаете, тот, у которого есть большинство исправлений и большинство функций ... – Flummox
Я бы согласился с вами, но это плагин, который будет использоваться только в доме. В основном причина, по которой я хочу указывать версии, заключается в том, что я могу различать зависимость производства и зависимость, которая имеет функциональность, специфичную для тестовой среды. Поэтому я могу переключаться между ними в конвейере CI. Поэтому ручное обновление build.gradle не является идеальным. –
Я не имел ввиду вручную, я имел в виду, что крючок должен писать там вместо того, чтобы писать в plugin.xml – jcesarmobile