2016-12-07 13 views
1

我正在爲具有Gradle依賴項的android編寫Cordova插件。 我希望開發人員能夠指定他們想要的依賴關係的版本,而無需直接編輯插件。允許用戶指定科爾多瓦插件的Gradle依賴項

現在我有這個在我的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它會正確地在命令行中指定的源更換框架SRC在plugin.xml現在論據。

我遇到的問題是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鉤正確更新,科爾多瓦使用舊值生成的build.gradle文件。

有沒有人有任何建議,或我可以採取不同的路線?

回答

1

您不必在plugin.xml中編寫代碼,因爲它只能在插件安裝時讀取。

如果您想編輯gradle引用,您可以在platforms/android/build.gradle文件中編寫,這是從plugin.xml複製引用的位置。

無論如何,我不認爲允許用戶選擇要使用的版本是一個好主意,作爲插件開發人員,您應該選擇您測試的版本,並且確定其工作正常,使用不同的版本可能會使插件無法正常工作或根本無法工作。

+0

*就是說,你幾乎總是想要最後的版本。你知道,錯誤修正最多,功能最多的一個...... – Flummox

+0

我同意你的看法,但是這是一個只能在家中使用的插件。基本上我想指定版本的原因是,我可以區分生產依賴性和具有特定於測試環境功能的依賴性。所以我可以在CI管道中切換它們。所以手動更新build.gradle並不理想。 –

+0

我的意思不是手動的,我的意思是鉤子應該寫在那裏,而不是寫在plugin.xml中 – jcesarmobile

0

取消@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; 
}; 
相關問題