【问题标题】:Allow user to specify Gradle dependency for Cordova plugin允许用户为 Cordova 插件指定 Gradle 依赖项
【发布时间】: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


    【解决方案1】:

    您不必在 plugin.xml 中写入,因为它只在插件安装时读取。

    如果你想编辑 gradle 引用,你可以写在platforms/android/build.gradle 文件中,这里就是plugin.xml 中的引用被复制的地方。

    无论如何,我认为允许用户选择要使用的版本不是一个好主意,作为插件的开发者,你应该选择你测试过的版本,并且你确信它可以正常工作,使用不同的版本可能会使插件无法正常工作或根本无法工作。

    【讨论】:

    • *话虽如此,您几乎总是希望拥有最新版本。你知道,拥有最多错误修正和最多功能的那个...
    • 我同意你的观点,但这是一个只能在内部使用的插件。基本上我想指定版本的原因是我可以区分生产依赖项和具有特定于测试环境的功能的依赖项。所以我可以在 CI 管道中切换它们。所以手动更新 build.gradle 并不理想。
    • 我不是说手动,我的意思是钩子应该写在那里而不是写在plugin.xml中
    【解决方案2】:

    接受@jcesarmobile 的建议,改为写入 build.gradle 文件。我首先检查 cmd 行中的任何参数,而不是检查 config.xml 中为特定插件设置的任何变量。这是我想出的脚本。

    module.exports = function (context) {
      var Q = context.requireCordovaModule('q');
      var deferral = new Q.defer();
      var result = null;
      var externalDep = null;
    
      var fs = require('fs'),
        xml2js = require('xml2js'),
        path = require('path'),
        util = require('util');
      var gradleLocation = process.cwd() + "/platforms/android/build.gradle";
      var parser = new xml2js.Parser({explicitArray: false});
    
      function findPluginVarInConfig() {
        fs.readFile(process.cwd() + '/config.xml', function (err, data) {
          parser.parseString(data, function (err, result) {
            //console.log(util.inspect(result, false, null));
            for (var i = 0; i < result.widget.plugin.length; i++) {
              if (result.widget.plugin[i]['$'].name == 'plugin-name') {
                externalDep = result.widget.plugin[i].variable['$'].value;
              }
            }
            if (externalDep) {
              console.log("found " + externalDep + " in config.xml");
              replaceGradleReference();
            } else {
              console.log("plugin-name could not find defined dependency defined in config.xml or cmd line args defaulting to 0.0.1");
              externalDep = "0.0.1";
              replaceGradleReference();
            }
          });
        });
      }
    
      function findPluginVarInCmdArgs() {
        for (var i = 0; i < process.argv.length; i++) {
          if (process.argv[i].indexOf('EXTERNAL_DEP') >= 0) {
            externalDep = process.argv[i].replace("EXTERNAL_DEP=", "");
          }
        }
        if (externalDep) {
          console.log("found " + externalDep + " in command line args");
          replaceGradleReference();
        } else {
          findPluginVarInConfig();
        }
      }
    
      function replaceGradleReference() {
        fs.readFile(gradleLocation, 'utf8', function (err, data) {
          if (err) {
            return console.log(err);
          }
          var replaced = false;
          if (data.indexOf('$INITIAL_PBR_SOURCE' >= 0)) {
            result = data.replace('$INITIAL_PBR_SOURCE', function (text) {
              replaced = true;
              return externalDep
            });
            if (!replaced) {
              console.log("FAILED TO ADD " + externalDep + " TO BUILD SCRIPT");
            }
          }
          if (result) {
            fs.writeFile(gradleLocation, result, 'utf8', function (err) {
              if (err) {
                console.log(err);
              } else {
                console.log("Succesfully added " + externalDep + " to buildscript");
              }
              deferral.resolve();
            });
          } else {
            console.log("PBR external dependency is already added to buildscript");
          }
        });
      }
    
      findPluginVarInCmdArgs();
      return deferral.promise;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多