【问题标题】:Angular 2 - angular-cli: set global variable on buildAngular 2 - angular-cli:在构建时设置全局变量
【发布时间】:2017-07-18 17:51:30
【问题描述】:

这是我第一次尝试部署 Angular2 应用程序。我想设置 API 端点的 URL,我希望它在每个环境中都不同。

有没有办法让 ng build 或任何其他允许在部署之前为我设置这个的工具?

【问题讨论】:

    标签: angular angular-cli


    【解决方案1】:

    使用 Angular CLI 工具,您可以配置不同的环境。

    ng build 可以指定构建目标(--target=production--target=development)和用于该构建的环境文件--environment=dev--environment=prod)。默认使用开发构建目标和环境。

    用于确定使用哪个环境文件的映射可以在angular-cli.json中找到:

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

    这些选项也适用于 serve 命令。如果您不传递环境值,则默认为 dev 用于开发,prod 用于生产。

    除了 devprod 之外,您还可以添加自己的 env 文件。

    然后,在你的代码中,你可以做一个简单的检查,就像 main.ts 文件中的默认检查一样:

    if (environment.production) {
      enableProdMode();
    }
    

    查看他们文档中的build targets and environment files 部分了解更多详情。

    PS:Here's a similar question,你可能会发现那里的答案也很有用。

    【讨论】:

    • Mersi bratle。如何从 .t​​s 文件(例如服务)中引用环境?我得到“环境未定义”。有什么特殊的导入方式吗?
    • 嗯,你一定是漏了一步。 1) 检查您的angular-cli.json 中是否有"environments": { "source": "environments/environment.ts", "dev": "environments/environment.ts", "prod": "environments/environment.prod.ts" }。 2) 检查您的src/environments/ 目录中是否有文件。 3) 您是否使用--environment=dev 标志运行ng build? 4) 检查你的 environment.ts 文件是否真的导出了常量:export const environment = { production: false }; PS: Molq bratle :)
    • 5) 检查您是否在使用它的地方缺少导入语句:import { environment } from './environments/environment';
    【解决方案2】:

    是的,实际上非常方便。看看src/environments/ 目录。您至少有 2 个文件,其中一个是 environment.ts不要更改这个。相反,您应该将与 env 相关的不同配置放在此目录中的其他文件中,例如environment.prod.ts.

    src/environments/environment.ts 中的评论很好地解释了一切:

    当前环境的文件内容将在构建期间覆盖这些内容。

    构建系统默认使用environment.ts的开发环境,但如果你这样做

    ng build --env=prod 然后environment.prod.ts 将被使用。

    哪个环境映射到哪个文件的列表可以在angular-cli.json找到。

    所以你只需要使用普通的打字稿导入来导入该文件中定义的常量,例如

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

    然后就可以在服务中设置了:

    @Injectable()
    export class SettingsService {
        public environment = environment;
    }
    

    现在您在其他地方注入使用此类服务​​,就像任何其他服务一样;)

    【讨论】:

    • 如何从 .t​​s 文件(例如服务)中引用环境?我得到“环境未定义”。有什么特殊的导入方式吗?
    • 通过服务调解环境有什么好处,而不是直接从我需要的地方访问它?
    • 我认为它可以为单元测试带来价值:在此设置中,您可以通过模拟服务轻松更改值(而不是为此提供额外的环境) - 然后您可以针对不同的环境运行测试“env”值等。
    猜你喜欢
    • 2017-02-08
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多