如何为Ember-CLI创建临时环境?

8mmmxcuj  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(153)

Ember CLI中有开发、测试和生产环境。我有测试和生产服务器。我需要在测试服务器上进行构建,就像在生产服务器上一样,但使用另一种环境配置。但Ember CLI中的测试env用于自动测试。
我尝试使用ember-cli-build.js文件中的下一个选项在测试服务器上调用ember build --environment development

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应用程序的正确方法是什么?

g6ll5ycj

g6ll5ycj1#

这可能会让人感到困惑,但是您需要的是而不是环境。您需要的是部署目标。下面是一篇关于两者区别的博文:Do not confuse environment for deploy target(该URL已在www.example.com的重组/接管中被丢弃deveo.com但仍为snapshot exists on archive.org)。
在Ember中,环境是关于如何缩小代码、对资产进行指纹识别、启用/禁用某些调试功能等。它们不是关于您希望在哪里部署代码、希望使用哪个API URL或类似的任何内容。
您可能碰巧拥有名为testdevelopment的服务器,但是在部署到这些服务器时,您应该始终将环境设置为production,而不是testdevelopment
为了支持多个服务器(部署目标),我将使用env vars来实现这一点。

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就可以为staging创建一个构建并部署它。

gc0ot86w

gc0ot86w2#

不幸的是,ember-cli对环境的支持很差。你只有开发和生产版本,不能添加新的。最重要的是,生产版本会做一些额外的事情,比如缩小,指纹等,这些在测试/暂存服务器上不一定需要,而且很耗时。
好消息是我们可以访问environment.js中的Node API。事实上,environment.js是一个节点模块。这允许我们向ember build添加额外的参数并解析它们。我在ember-cli 2.7中成功地使用了这个技巧,在2.8中也使用了。您需要:
1.安装minimistnpm install minimist --save-dev
1.将以下代码添加到environment.js的开头:

var argv = require('minimist')(process.argv.slice(2));
console.log('Sub-environment is set to ' + argv.subenv);

1.在environment.js中使用argv.subenv来识别不同的“子环境”,我建议在“environment”块之后这样做:

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 = '';
}

您可以根据需要在代码中合并environmentargv.subenv
1.在构建时使用您的参数:Ember-cli将输出一个关于不支持参数的警告,但一切都将正常工作。
使用这种方法,您可以根据需要拥有任意多台服务器,并在其中任何一台服务器上构建应用的开发/生产版本。
至于你的错误,我不知道是什么原因造成的,可能你会发现一些here

v6ylcynt

v6ylcynt3#

当参数等于staging时,编辑config/environment.js以设置环境。例如:
功能(环境){

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"`

相关问题