2016-12-07 22 views
1

Gradle依存関係のあるAndroidのCordovaプラグインを作成しています。 私は、プラグインを直接編集することなく、開発者が必要とする依存関係のバージョンを指定できるようにしたいと考えています。CordovaプラグインのGradle依存関係を指定できるようにする

<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を置き換えるフックを持っている:

は今、私は私の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でプラグインを追加した場合、それは正しく、コマンドラインで指定されたソースでplugin.xmlのフレームワークsrcを置き換えます引数。

私が問題になっているのは、コードバが新しいplugin.xmlを気にしていないようだということです。古いplugin.xmlのフレームワークタグは引き続き使用されます。

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フックに正しく更新取得されていても、コルドバはbuild.gradleを生成するために、古い値を使用しています。私はまだこれ見生成build.gradleファイルで

ファイル。

誰にも提案がありますか、別のルートがありますか?

答えて

1

plugin.xmlに書き込む必要はありません。これは、プラグインのインストール時にのみ読み込まれるためです。

gradleの参照を編集する場合は、プラットフォーム/ android/build.gradleファイル(plugin.xmlの参照がコピーされる場所)に書き込むことができます。

とにかく、ユーザーが使用するバージョンを選択できるようにするのは良い考えではありません。プラグインの開発者は、テストしたバージョンを選択する必要があります。別のバージョンでは、プラグインが正しく動作しないか、まったく動作しない可能性があります。

+0

*といっても、ほとんどの場合、最後のバージョンを使用したいと考えています。あなたが知っている、最も多くのバグフィックスと多くの機能を持つもの... – Flummox

+0

私はあなたに同意するが、これは家でのみ使用されるプラグインです。基本的に私がバージョンを指定したい理由は、プロダクションの依存関係とテスト環境固有の依存関係を区別することができるからです。 CIパイプライン内でそれらの間を切り替えることができます。したがって、build.gradleを手動で更新するのは理想的ではありません。 –

+0

私は手動ではありませんでしたが、私はフックがplugin.xmlに書き込む代わりにそこに書き込むべきであることを意味しました – jcesarmobile

0

代わりに@jcesarmobileのアドバイスを受け取り、代わりにbuild.gradleファイルに書きました。私は最初に特定のプラグインに設定された変数のconfig.xmlをチェックするよりも、引数のためにcmd行をチェックします。ここに私が思いついたスクリプトがあります。

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; 
}; 
関連する問題