【问题标题】:Apache Cordova : use different settings in config.xml for debug and releaseApache Cordova:在 config.xml 中使用不同的设置进行调试和发布
【发布时间】:2019-05-17 23:43:14
【问题描述】:

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

例如,我需要将其用于调试构建:

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

并更改为发布版本:

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

我还需要更改一些 &lt;preference /&gt;&lt;variable /&gt; 标签中的值

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

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

这不是很方便:/

【问题讨论】:

    标签: cordova


    【解决方案1】:

    如果您使用在命令行中定义的不同环境,您可以创建一个模板config.xml(文件为config.tpl.xml)和一个before_preparecordova 挂钩,以将模板中的变量替换为正确的值和将生成的内容保存在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}" />
    

    它会根据使用的环境文件将${CONTENT_URL} 转换为正确的url(您需要在环境json 文件中有一个属性CONTENT_URL)。

    欲了解更多信息,请参阅https://stackoverflow.com/a/46345926/4850646

    【讨论】:

    • 但是如果动作中途停止了怎么办?我的意思是,在 config.xml 文件被重构之后
    • @Raz 你看到了什么问题?我将有 2 个文件 config.tpl.xmlconfig.xml,并且挂钩将根据 config.tpl.xml 中定义的模板更新 config.xml。但最后科尔多瓦只会看到config.xml 文件(已经有正确的值)。
    • 卢卡斯这正是我现在正在做的 :)
    • 嗨 Lucas,你如何添加新插件,例如,你是添加到 config.tmplate.xml 还是 config.xml 中?如果添加到 config.xml,如何更新模板配置?手动?
    • @Raz 我添加到模板中,因为 config.xml 在每次构建时都会被覆盖。
    【解决方案2】:

    更新:好的,这对我有用。我只需要更新路径以加载 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);
    };
    

    【讨论】:

      【解决方案3】:

      很遗憾,您的问题没有确切的解决方案。但是你可以在这个插件中查找。我希望这对你很有帮助。

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

      【讨论】:

      • 这个插件会响应不同的环境变量吗?
      【解决方案4】:

      我制作了 config.xml 的两个副本:config.Debug.xmlconfig.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 更新时被覆盖。

      【讨论】:

        【解决方案5】:

        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"
            };
        

        【讨论】:

          猜你喜欢
          • 2017-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-08
          • 2012-03-02
          • 1970-01-01
          • 2015-12-22
          • 2011-06-02
          相关资源
          最近更新 更多