Ember CLI
中有开发,测试和生产环境。
我有测试和生产服务器。而且我需要在测试服务器上进行构建,就像生产一样,但需要另外的环境配置。但是Ember CLI
中的测试env用于自动测试。
我尝试使用ember build --environment development
文件中的下一个选项在测试服务器上调用ember-cli-build.js
:
var app = new EmberApp(defaults, {
// Add options here
fingerprint: {
prepend: 'https://s-test.mycdn.com/',
enabled: true
}
});
但我收到了错误:
The Broccoli Plugin: [AssetRewrite] failed with:
TypeError: Cannot read property '2' of null
.....
The broccoli plugin was instantiated at:
.....
在测试服务器上构建ember应用程序的正确方法是什么?
答案 0 :(得分:3)
不幸的是,对ember-cli环境的支持很差。您只有开发和生产,不能添加新的。最重要的是,生产版本还会执行其他操作,例如缩小,指纹识别等,这些在测试/登台服务器上并不一定需要,而且非常耗时。
好消息是我们可以访问environment.js中的Node API。实际上,environment.js是一个节点模块。这允许我们向ember build
添加其他参数并解析它们。我成功地在ember-cli 2.7中使用了这个技巧,并且也在2.8中使用过。你需要:
npm install minimist --save-dev
将此代码添加到environment.js:
的开头var argv = require('minimist')(process.argv.slice(2));
console.log('Sub-environment is set to ' + argv.subenv);
在environment.js中使用argv.subenv
来识别不同的“子环境”。我建议在“环境”阻止后执行此操作:
if (argv.subenv === 'mirage') {
ENV['ember-cli-mirage'] = {
enabled: true
};
ENV.API.namespace = '';
ENV.API.host = '';
}
if (argv.subenv === 'staging') {
ENV['ember-cli-mirage'] = {
enabled: false
};
ENV.API.host = 'https://your-server.com/';
ENV.API.namespace = '';
}
您可以根据需要在代码中合并environment
和argv.subenv
。
ember build --environment=development --subenv=staging
。 Ember-cli将输出关于不支持的参数的警告,但一切都会正常工作。使用此方法,您可以拥有所需数量的服务器,并在其中任何一个上构建应用程序的开发/生产版本。
至于你的错误,我不确定是什么导致它,可能你会发现here
答案 1 :(得分:3)
这可能令人困惑,但您想要的是不环境。您需要部署目标。这是一篇关于两者之间差异的博文:Do not confuse environment for deploy target。
在Ember中,环境是关于如何缩小代码,对资产进行指纹识别,启用/禁用某些调试功能等。他们不关于您要部署代码的位置,哪个API您要使用的网址,或类似的网址。
您可能碰巧有名为test
或development
的服务器,但在部署到这些服务器时,您应始终将环境设置为production
,而不是test
或{{ 1}}。
为了支持多个服务器(部署目标),我会使用env vars来做到这一点。类似的东西:
development
在您的DEPLOY_TARGET=development ember build --environment=production
DEPLOY_TARGET=test ember build --environment=production
DEPLOY_TARGET=staging ember build --environment=production
DEPLOY_TARGET=production ember build --environment=production
中,您只需通过ember-cli-deploy.js
访问该值,如下所示:
process.env.DEPLOY_TARGET
我建议使用const deployTarget = process.env.DEPLOY_TARGET;
if (deployTarget === 'development') {
// ...
} else if (deployTarget === 'test') {
// ...
} else if (deployTarget === 'staging') {
// ...
} else if (deployTarget === 'production') {
// ...
}
插件自动执行此过程,以便您只需键入ember-cli-deploy
即可为ember deploy staging
创建构建并进行部署。
答案 2 :(得分:-1)
在参数等于config/environment.js
时编辑您的staging
以设置您的环境。例如:
``` 功能(环境){
var ENV = {
// SET ENV properties
APP: {
// Here you can pass flags/options to your application instance
// when it is created
},
contentSecurityPolicy: {
// Configure security
}
};
if (environment === 'production') {
// Set production values
}
if (environment === 'staging') {
// Set staging values
}
if (environment === 'development') {
// Set staging values
}
if (environment === 'test') {
// Set testing values
}
return ENV;
};
```
然后在尝试构建版本时使用以下命令:
ember build --environment="staging"