我正在寻找一种在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
这不太方便:/
答案 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.json
或environment.prod.json
(可以在上面的钩子中更改)。
在config.tpl.xml
:
<content src="${CONTENT_URL}" />
根据所使用的环境文件(您需要在环境json文件中拥有属性${CONTENT_URL}
),它将变为CONTENT_URL
到正确的URL中。
答案 2 :(得分:0)
不幸的是,没有针对您的问题的确切解决方案。但你可以在这个插件中查找。我希望这对你有用。
答案 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"
};