Apache Cordova:在config.xml中使用不同的设置进行调试和发布

时间:2016-09-16 18:39:15

标签: cordova

我正在寻找一种在config.xml文件中使用不同设置的方法:调试版本的一些设置和版本构建的其他设置。

例如,我需要将它用于调试版本:

<content src="https://staging.mywebsite.com" />

对于发布版本,请更改为

<content src="https://www.mywebsite.com" />

我还需要更改某些<preference /><variable />代码中的值

Cordova-CLI的build命令似乎没有任何参数来指定用于构建的config.xml

目前,我能找到的唯一方法是将config.xml重命名为config-debug.xml,将其复制到config-release.xml并更改其中的某些值。当我需要构建时,将我想要使用的xml重命名为config.xml

这不太方便:/

5 个答案:

答案 0 :(得分:3)

更新:好的,这对我有用。我只需要更新加载common.xml和编写config.xml的路径。

我正在使用其中一个钩子,可能是before_prepare和before_run。我需要测试一下,但这就足够了

我将config.xml放入我创建的子文件夹中,因此它不会被覆盖,或者您可以重命名它。然后我使用xml2js加载,解析,并重建回xml。

#!/usr/bin/env node
const xml2js = require('xml2js');
const fs = require('fs');

const parseString = xml2js.parseString;
const builder = new xml2js.Builder();

const stagingDeploymentKey = "YOU_STAGING_KEY";
const productionDeploymentKey = "YOU_PROD_KEY";

/************************************************************
 * load our commong config xml and parse it into a JS object
 */
var commonXML = fs.readFileSync(__dirname + '/../configs/common.xml').toString();
var commonObj;
parseString(commonXML, function (err, result) {
  commonObj = result;
});


module.exports = function(context) {
  // default to staging key
  var CodePushDeploymentKey = stagingDeploymentKey;

  // cordova build ios --release
  if (context.opts.options.release === true) {
    // set KEY to production one
    CodePushDeploymentKey = productionDeploymentKey;
  }

  // replace value in with proper environment specific key
  commonObj.widget.platform[1].preference[0].$.value = CodePushDeploymentKey;

  // write the xml file to the root director of the project so cordova can read it
  var xml = builder.buildObject(commonObj);
  fs.writeFileSync(__dirname + '/../config.xml', xml);
};

答案 1 :(得分:2)

如果您使用在命令行中定义的不同环境,则可以创建模板config.xml(文件为config.tpl.xml)和before_prepare cordova挂钩以替换具有正确值的模板,并将生成的内容保存在config.xml

钩子是:

#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var compile = require('es6-template-strings/compile');
var resolveToString = require('es6-template-strings/resolve-to-string');

var ROOT_DIR = process.argv[2];
var FILES = {
    SRC: "config.tpl.xml",
    DEST: "config.xml"
};

var env = process.env.NODE_ENV || 'dev';
var envFile = 'src/environments/environment.' + env + '.json';

var srcFileFull = path.join(ROOT_DIR, FILES.SRC);
var destFileFull = path.join(ROOT_DIR, FILES.DEST);
var configFileFull = path.join(ROOT_DIR, envFile);

var templateData = fs.readFileSync(srcFileFull, 'utf8');

var configData = fs.readFileSync(configFileFull, 'utf8');
var config = JSON.parse(configData);

var compiled = compile(templateData);
var content = resolveToString(compiled, config);

fs.writeFileSync(destFileFull, content);

我在这里使用环境变量NODE_ENV,如果你使用另一个(如APP_ENV),只需在上面的钩子中做相应的更改。钩子从src/environments/environment.[env].json加载json,如environment.dev.jsonenvironment.prod.json(可以在上面的钩子中更改)。

config.tpl.xml

<content src="${CONTENT_URL}" />

根据所使用的环境文件(您需要在环境json文件中拥有属性${CONTENT_URL}),它将变为CONTENT_URL到正确的URL中。

有关详细信息,请参阅https://stackoverflow.com/a/46345926/4850646

答案 2 :(得分:0)

不幸的是,没有针对您的问题的确切解决方案。但你可以在这个插件中查找。我希望这对你有用。

https://www.npmjs.com/package/cordova-custom-config

答案 3 :(得分:0)

我已经制作了两份 config.xml config.Debug.xml config.Release.xml (我有两个配置)。

然后我添加了一行到MSBuild目标文件( Microsoft.MDA.FileMirroring.targets ),该文件在编译之前将目标文件复制到config.xml:

<Copy SourceFiles="$(ProjectDir)config.$(Configuration).xml" 
DestinationFiles="$(ProjectDir)config.xml"
Condition="Exists('$(ProjectDir)config.$(Configuration).xml')"
></Copy>

此方法的缺点是您需要保留此文件的副本,因为它将在每次TACO更新时被覆盖。

答案 4 :(得分:0)

gulpfile.js

    const gulp = require('gulp');
    const Config = require('cordova-config');
    var fs = require('fs');
    var argv = require('yargs').argv;

    gulp.task('config', function () {

        let data;
        let env = argv.channelTag;
        if (!env || env === 'dev') {
            data = fs.readFileSync('src/environments/environment.ts', 'utf-8');
        } else {
            data = fs.readFileSync('src/environments/environment.' + env + '.ts', 'utf-8');
        }

        let startIndex = data.indexOf("{");
        let lastIndex = (data.indexOf("}")) + 1;

        let configEnv = JSON.parse(data.substring(startIndex, lastIndex));
        console.log(configEnv);

        const configXml = new Config('config.xml');

        configXml.setID(configEnv.appId);
        configXml.setName(configEnv.appName);
        configXml.setVersion(configEnv.version);
        configXml.setAndroidVersionCode(configEnv.versionCode);


        // Write the config file
        configXml.writeSync();
    });

environment.ts

     export const environment = {
      "production": false,
      "appId": "in.xyz.abcDev",
      "appName": "MyApp Dev",
      "version": "0.0.1",
      "versionCode": "1000"
    };