【问题标题】:How to config different development environment in Angular 2 app如何在 Angular 2 应用程序中配置不同的开发环境
【发布时间】:2016-06-30 12:15:39
【问题描述】:

我有一个常量文件

export class constants {
    public static get API_ENDPOINT(): string { return 'https://dvelopment-server/'; }
}

然后我将它导入到我的服务中

private _registrationUrl = constants.API_ENDPOINT+'api/v1/register';

如何使用 server change 更改端点。我有开发服务器登台服务器和本地服务器。我希望应用程序检测环境变化。

在我的 angular 1 应用程序中,我为此使用了 envserviceprovider。我可以在 Angular 2 应用程序中使用相同的吗?

【问题讨论】:

  • 我认为你也可以在 angular2 中做到这一点。不确定 angular2 中是否有这个库的等价物,但我相信你可以自己轻松复制它。您必须检查您的应用程序正在运行的域(localhost、devserver.com 等),并在此基础上从服务的配置对象中设置设置变量。
  • 如何检查运行 Angular 2 应用程序的域
  • 你可以使用位置,如果self前缀为https://developer.mozilla.org/en-US/docs/Web/API/Locationhttps://developer.mozilla.org/en-US/docs/Web/API/WorkerLocation,它甚至可以在webworker中工作
  • 如果您想构建一次并多次部署相同的构建工件,请参阅stackoverflow.com/a/43980985/2540679
  • 我建议您查看stackoverflow.com/a/40431356/606513。基本思想是使用脚本(例如在 docker 容器中)根据您的环境修改创建的缩小 js。

标签: angular angular2-services


【解决方案1】:

@cartucho 的回答非常有效,直到您尝试使用 Heroku 或 Github 操作等服务部署到多个环境。这些服务使使用节点环境变量变得容易,但无法配置特定于环境的构建命令。

解决这个问题的一种方法是像@cartucho 建议的那样设置你的 Angular 环境变量,然后设置你的构建脚本来调用一个小节点应用程序。节点应用程序读取节点环境变量,然后决定运行哪个构建命令。

在 package.json 中:"build": "node build-app.js",

构建-app.js:

const { exec } = require('child_process');

let buildScript = 'ng build --configuration=staging';
if (process.env.ANGULAR_ENVIRONMENT_CONFIGURATION === 'production') {
    buildScript = 'ng build --configuration=production';
}
const child = exec(buildScript, function (err, stdout, stderr) {
    if (err) throw err;
    else console.info(stdout);
});

child.stdout.on('data', function (data) {
    process.stdout.write(data);
});

child.stderr.on('data', function (data) {
    process.stdout.write(data);
});

child.on('exit', function (data) {
    process.stdout.write("I'm done!");
});

我会在我的博文中更详细地讨论 Angular Universal 所需的额外步骤:https://dev.to/jfbloom22/a-better-way-to-deploy-angular-universal-to-multiple-environments-206j

【讨论】:

    【解决方案2】:

    简答:使用Angular CLI。它处于测试阶段,但效果非常好,Angular 团队推荐它用于启动新项目。使用此工具,您可以配置不同的环境。在构建时,src/client/app/environment.ts 将替换为 config/environment.dev.tsconfig/environment.prod.ts,具体取决于当前 CLI 环境。

    环境默认为dev,但您可以通过ng build -prodng serve -prod 中的-prod 标志生成生产版本。鉴于这是一项新功能,它可能会有点令人困惑,因此请查看 this great guide 以获取有关如何使用 CLI 设置 Angular 环境的更多信息。

    希望这会有所帮助。

    【讨论】:

    • 请注意,指南中的import 命令似乎不再有效(可能路径已更改)。这对我有用:import { environment } from '../../environments/environment';
    • 这是我使用的方法,非常棒。我们还有一个测试环境,它使用与 dev 和 prod 不同的配置,所以我添加了第三个环境“test”并通过 angular-cli.json 中的“environments”映射它。因此,根据环境,它会引入适当的配置。
    • @zavié 也许import { environment } from "app/../environments/environment;" 更好,因为它适用于每个文件位置。
    • 很好奇...如果您继承了手动构建而不是通过 Angular CLI 构建的 Angular 2 应用程序怎么办?什么是“长答案”?
    • @markreyes 我猜在这种情况下你至少有 2 个选项。选项一:从头开始创建一个 CLI 项目并迁移您的应用程序。选项二:在继承的应用程序基础架构、构建工具、npm 项目或您拥有的任何东西中添加处理环境的功能。对于“长答案”,请查看其他响应以获取想法,或创建一个新的 CLI 项目并查看代码(顺便说一句,这就是开源项目的魔力)。
    【解决方案3】:

    希望对你有帮助。

    首先,创建 development.ts、staging.ts、production.ts 配置文件。 其次,在你的 index.pug 中,按如下方式导入环境文件:

       SystemJS.import("#{settings.env}").then(function(env) {
           System.import("app").catch(console.error.bind(console));
       } // Promise.all also works!
    

    请记住,在 nodeJS/Pug/Jade settings.env 中包含 NODE_ENV 值。

    最后,你的 system.config.ts 映射应该有以下几行:

        "development": "myUrl/configs/development.js",
        "staging": "myUrl/configs/staging.js",
        "production": "myUrl/configs/production.js",
    

    【讨论】:

      【解决方案4】:
      export class endPointconfig {
      
          public static getEnvironmentVariable() {
              let origin = location.origin;
              let path = location.href.split('/')[3];
              let value = origin +'/'+ path + '/api/';`enter code here`       
              return value;
          }
      }
      

      【讨论】:

      • 在你的服务上调用endPointConfig类返回url
      【解决方案5】:

      我只想在@Cartucho 提供的答案中添加更多亮点。他对为您的 Angular 2 应用程序设置个性化环境所需的步骤是正确的。 我也想对Guide to Build the app in different environments的文章发表意见

      但是给定的文章错过了一个重要步骤。设置个性化环境的步骤如下: 1)在项目的环境文件夹中创建一个名为 environment.YourEnvName.ts 的新文件。 2)在“环境”对象中添加环境描述 angular-cli.json 文件。

      "environments": {
          "source": "environments/environment.ts",
          "prod": "environments/environment.prod.ts",
          "dev": "environments/environment.dev.ts", 
          "qa": "environments/environment.qa.ts",
          "YourEnvName": "environments/environment.YourEnvName.ts"
        }
      

      3) 完成这些更改后,您可以使用以下命令为您的新环境构建应用程序。

      ng build --environment=YourEnvName or 
      
      ng serve --environment=YourEnvName 
      

      希望这篇文章对任何新的 Angular 2 开发人员有所帮助。

      【讨论】:

        【解决方案6】:

        我已经通过添加类方法解决了这个问题

        export class config {
        
            public static getEnvironmentVariable(value) {
                var environment:string;
                var data = {};
                environment = window.location.hostname;
                switch (environment) {
                    case'localhost':
                        data = {
                            endPoint: 'https://dev.xxxxx.com/'
                        };
                        break;
                     case 'uat.server.com':
                        data = {
                            endPoint: 'https://uat.xxxxx.com/'
                        };
                        break;
        
                    default:
                        data = {
                            endPoint: 'https://dev.xxxx.com/'
                        };
                }
                return data[value];
            }
        }
        

        为我服务

        private _loginUrl = config.getEnvironmentVariable('endPoint')+'api/v1/login;
        

        【讨论】:

        • 我不喜欢这个解决方案的地方在于它公开了你的开发环境的内部结构。我正在考虑在连接之前使用 Grunt 将依赖于目标的文件复制到位,定义配置类。但是,我觉得必须有更好的方法。
        • 这只是一个糟糕的解决方案。这不应该是公认的答案。
        • 当你有环境时为什么要使用另一个类? @zavié 给出了一个很好的解决方案
        • 如果您只进行一次构建并随处部署的方法,那么除了与此类似的解决方案之外,您没有任何其他解决方案。
        • 添加 +1 作为其选择的解决方案。请大家根据所提问题进行回答。
        猜你喜欢
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 2021-04-07
        相关资源
        最近更新 更多