--ng build --env=prod不起作用

46
我正在使用angular4(4.4.6)和CLI 1.4.3。我尝试按照这篇文章创建环境变量:https://alligator.io/angular/environment-variables/。我最终得到了3个文件:environment.ts
export const environment = {
  production: false,
  restUrl: 'http://localhost:3000/',
  socketUrl: 'http://localhost:2000'
};

environment.prod.ts

export const environment = {
  production: true,
  restUrl: 'http://139.130.4.5:3000/',
  socketUrl: 'http://139.130.4.5:2000'
};

以及environment.staging.ts

export const environment = {
  production: true,
  restUrl: 'http://139.130.4.5:3000/',
  socketUrl: 'http://139.130.4.5:2000'
};

我使用它们如下:

import { environment } from '../../environments/environment';
 constructor() {
    this.serverUrl = environment.restUrl;
    console.log('the env is:' this.serverUrl');
  }

.angular-cli.json文件中,我有以下内容:

"environmentSource": "environments/environment.ts",
      "environments": {
        "dev": "environments/environment.ts",
        "prod": "environments/environment.prod.ts",
        "staging": "environments/environment.staging.ts"
      }

有一个奇怪的问题,当我运行ng build --env=prod时,虽然编译和一切工作正常,但最终产品仍会使用本地主机(dev)环境变量。

更奇怪的是,当我使用ng server --env=prod时,它完美地使用了生产环境变量。

为什么会这样?我该如何使用prod或staging环境变量进行构建?


@ Efim,我在使用Angular 5时遇到了同样的问题,下面的解决方案都没有对我起作用:(,你有适用于版本5的解决方案吗? - Abilash
@Efim,你有没有找到这个问题的解决方案? - Devner
7个回答

56

使用以下命令来构建Angular 6应用

ng build --prod --configuration=dev

或使用别名:

ng build --prod --c=dev

4
这并不针对环境文件,而是针对 angular.json 文件中的配置条目。 - Ayyash
3
虽然目的相同,但您需要在 angular.json 配置文件中添加文件替换(当您迁移到 Angular 6 时应该会自动创建该文件)。请注意,不要更改原文意思,同时尽可能使翻译通俗易懂。 - Jon La Marr

20
Angular 7+ (8/9/10) - 通过CLI创建的项目: ng build --prod --configuration production

9

事实是,我还没有准备好投入生产, Angular 对无用的文件不满意(这些文件将来会被使用)。 - Efim Rozovsky

6
这是一个旧问题,在较新版本的cli中已经解决。不过,我不知道你使用的cli和@angular次要版本和补丁版本是什么,所以无法确定是否解决了这个问题。
尝试在你的.angular-cli.json环境中添加“./”。
"environments": {
    "dev": "./environments/environment.ts",
    "prod": "./environments/environment.prod.ts",
    "staging": "./environments/environment.staging.ts"
}

如果这个方法对您有用,我建议您升级依赖项和cli到最新版本,并将您的angular包升级到最新的4.minor.patch版本,以避免遇到其他已经修复的错误。

1
'./'修复方法不起作用,我使用的是Angular 4.4.6和CLI 1.4.3。 - Efim Rozovsky

3

您可以在 angular.json 中为特定的构建目标添加文件替换。

生产环境

"configurations": {
  "production": {
    "fileReplacements": [
      {
        "replace": "src/environments/environment.ts",
        "with": "src/environments/environment.prod.ts"
      }
    ],

运行ng build --configuration=production,src/environments/environment.ts文件将被替换为特定目标版本的文件src/environments/environment.prod.ts。

暂存

"configurations": {
  "production": {},
  "staging": {
    "fileReplacements": [
      {
        "replace": "src/environments/environment.ts",
        "with": "src/environments/environment.staging.ts"
      }
    ]
  }
}

要使用暂存配置构建,请运行以下命令:

ng build --configuration=staging

您还可以在build中添加defaultConfiguration

 "build": {
    "configurations": {.......},
    "defaultConfiguration": "staging"

}

当你运行ng build命令时,构建的目标是staging

谢谢。以上工作适用于Angular的版本:15.0.1。 - BUDDHIKA

1

确保您的各个组件中的导入是正确的。错误地导入了错误的环境文件也可能会导致此问题。在我的情况下,我的导入方式如下:

import { environment } from '../../../../environment/environment.dev'; 

在我们发现这个问题之前,很多人都感到困惑,因为我们从未查看过导入的内容。只有导入environment.ts文件才能使用替换后的文件。更正后的导入应该是这样的:

import { environment } from 'src/environments/environment';

-1
尝试使用下面的命令:

ng build -prod


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接