Deployment meteor应用程序如何知道它是否';是在开发、测试还是在生产环境中运行?

Deployment meteor应用程序如何知道它是否';是在开发、测试还是在生产环境中运行?,deployment,meteor,Deployment,Meteor,当meteor应用程序作为开发、测试或生产环境运行时,我需要使用不同的帐户提供商配置。实现这一点非常麻烦 注意:界面很好,实现很混乱,github有一个开放的平台,可以实现这一点。评论/投票支持它,因此它更有可能被包括在内 在运行meteor run或meteor deploy时,您可以使用与--settings结合使用的选项 例如,要在dev模式下运行,请创建一个JSON文件,将其命名为meteorConfigDev.JSON,并将以下内容放入其中: { "public" : {

当meteor应用程序作为开发、测试或生产环境运行时,我需要使用不同的帐户提供商配置。

实现这一点非常麻烦

注意:界面很好,实现很混乱,github有一个开放的平台,可以实现这一点。评论/投票支持它,因此它更有可能被包括在内

在运行
meteor run
meteor deploy
时,您可以使用与
--settings
结合使用的选项

例如,要在
dev
模式下运行,请创建一个JSON文件,将其命名为meteorConfigDev.JSON,并将以下内容放入其中:

{
  "public" : {
    "mode" : "dev"
  },
  "anotherProperty" : "anotherValue"
}
使用

meteor --settings meteorConfigDev.json
在服务器和客户端上,您可以通过以下方式访问“模式”:

请注意,“public”中的设置在服务器和客户端上都可用,而其他所有设置(在本例中为“anotherProperty”)仅在服务器上可用

然后,您可以为不同的环境设置不同的配置文件。

在服务器上:

var inDevelopment = function () {
  return process.env.NODE_ENV === "development";
};

var inProduction = function () {
  return process.env.NODE_ENV === "production";
};
Meteor在运行Meteor时将环境变量NODE_ENV设置为“development”。在生产中,您可以将变量设置为您想要的任何值,否则它将默认为“生产”

更新:我创建了一个智能包,允许它在客户端和服务器上工作

mrt add allow-env
只需在服务器文件中设置权限规则

allowEnv({
 NODE_ENV: 1
});

很简单。我在五个(是的,五个!)不同的环境中运行我的应用程序。我只是在根URL上使用一个switch语句,如下所示,用于四种不同的环境。当然,如果只有两个环境,则可以使用if-else。在服务器上工作。只需创建一个名为startup.js的新文件,并使用下面的代码示例。干杯

switch (process.env.ROOT_URL) {
    case "http://www.production.com/":
       BLOCK OF CODE HERE
       break;
    case "http://www.staging.com/":
       BLOCK OF CODE HERE
       break;
    case "http://www.development.com/":
       BLOCK OF CODE HERE
       break;
    case "http://localhost:3000/":
       BLOCK OF CODE HERE
       break;
}
通常,javascript中switch语句的格式为

switch(expression) {
    case n:
        code block
        break;
    case n:
        code block
        break;
    default:
        default code block
}

更新:请注意,Meteor现在提供了
Meteor.absoluteUrl()
,与
process.env.ROOT\u URL
类似,并添加了额外的功能。请参阅。

自从Meteor 1.3以来,这些标志都是开箱即用的:

Meteor.isDevelopment
Meteor.isProduction
Meteor.isTest
Meteor.isAppTest

这只适用于最基本的情况,如果你想在本地机器上测试你的env而不进行完全部署,这是行不通的。是的,绝对是权宜之计。但在基本情况下仍然有效。我使用它来为新的身份验证系统适当地设置api id,但我渴望用更好的解决方案来替换它。通过在服务器端的Meteor.startup函数中添加一个switch语句可以轻松实现。请参阅下面我的详细答案。这对我不起作用,因为我的应用程序是自托管的,当我通过“meteor run--production”启动我的应用程序时,meteor仍然将process.env.NODE_env设置为“development”(似乎不合理,但它们有其原因-请参阅链接)。这是多年来的一个已知问题,例如,此处讨论:。“否则它将默认为“生产”:这是否取决于您的主机位置/您使用什么工具来主机?我看到有几个应用程序因类似代码而中断。此代码使您的功能依赖于独立于环境的属性(URL)。如果更改了URL,则功能可能会中断,可能没有人注意到。此外,如果要更改URL(或添加另一个URL),您现在必须在代码中多更改一个位置,您可能在几个月后就忘记了。依赖于您的环境的功能对于您的应用程序来说通常是至关重要的,不容易干净地测试,也不太容易维护,因此您必须格外小心。@opyh:“X如何知道是否在Y上运行?”?“这是一个质疑环境的问题。在不检查环境的情况下,你怎么愿意回答这个问题?这样的回答将超出范围。这在我的经验中从未中断过;因此,如果您确信这是错误的,那么您似乎需要拿出一些示例和更好的解决方案。我并不建议您不要检查
环境,但您不应该从URL推断您的环境,因为URL可能会因各种原因独立于您的环境而更改。如果您的同事不知道您的根URL对您的应用程序逻辑具有“神奇”的额外意义,则有3种实际情况会在生产时破坏您的应用程序:1)删除
www.
,2)将
http
更改为
https
,3)具有属于您的生产应用程序的多个URL并更改默认URL。还有一个更好的解决方案:将您的环境名称放入额外的
env
变量(例如
process.env.METEOR\u environment
)或配置中,就像go oleg那样。
Meteor.isDevelopment
Meteor.isProduction
Meteor.isTest
Meteor.isAppTest