【问题标题】:Can I pass arguments to angular-cli at build-time我可以在构建时将参数传递给 angular-cli
【发布时间】:2016-09-09 09:30:27
【问题描述】:

在构建Angular2(打字稿)应用程序时,我想将自定义参数传递给angular-cli。这可能吗?如何在我的代码中访问此参数?

场景是这样的:我有一个Angular2 应用程序,有2 个布局。每个布局有 3 种颜色(红、蓝、绿)。我想建立所有可能的组合。每个布局和颜色一个应用程序 => layout1red, layout1green, layout2blue, ...

我想为每个构建创建 6 个 JSON 配置文件,我在其中定义布局和颜色,也许还有一些其他属性。

【问题讨论】:

    标签: typescript angular build-tools angular-cli


    【解决方案1】:

    只是对答案的更新。 您有多种选择:

    1. 要运行多个配置,只需在angular.json 中创建一个新的配置对象,在projects.[your project].architect.build.configurations 中查看您可以创建一个新的配置对象并对fileReplacements 进行更改。要运行这个新配置,只需使用 ng build --c=my_new_env_name

    2. 如果您选择替换的不仅仅是配置文件,可能要完全使用不同的 css 文件,那么您可以在 angular.json 中添加一个新项目,只需在 projects.[my new project name] 中添加一个新项目对象并修改 @987654328 @ 部分。对新项目配置满意后,简单运行 ng build my-new-project-nameng serve my-new-project-name

    选择权在您手中,您可以使用angular.json 查看文档https://angular.io/cli/build

    【讨论】:

      【解决方案2】:

      我没有完全理解你的问题,我可以想到两种方法来实现这一点:

      A- 生成新项目时传递参数:

      1- 为了能够将参数传递给 angular cli,您需要了解您希望在哪里使用它。

      如果您的布局中使用了这些配置,您可以分叉 Angular cli 并更新它的蓝图并轻松添加您自己的配置。

      这是组件蓝图:

           angular-cli/packages/@angular/cli/blueprints/component/files/__path__/__name__.component.ts
      

      看起来像这样:

      @Component({
        selector: '<%= selector %>',<% if(inlineTemplate) { %>
        template: `
      

      你看到selector 了吗?这是您可以使用的组件的名称,最后当您创建一个新项目时,您可以在那里传递您自己的标志并使用它。

      但这不是最好的主意,因为当 Angular cli 更新时,您总是会遇到麻烦。

      2- 另一个可能的解决方案是使用ng eject

      这将在一个单独的文件中生成webpack 配置并将其放在您的项目根文件夹中,然后您可以使用该文件并提供您的配置并根据您的应用对其进行自定义。

      但同样,我不确定您想如何使用该配置。

      这是您build time 配置的完美候选。

      3- 使用environments 配置:

      已经回答了,这也很方便提供build time的配置:

      关注@mikedanylov 的回答,然后在您的文件中像这样使用它:

      import { environment } from './environments/environment';
      
      if(environment.colorRed==='blue'){
      
           console.log('the color is blue');
      
      }
      
      
       npm build -e=colorRed
      

      乙:Run time

      这是一个更好的选择,您可以像这样在 index.html 中创建一个调用:

        <script src="wherever/configurations/blue"></script>
      

      然后在配置里面,你可能有:

        var configuration = {
            whatEver:"blue"
        }
      

      因为这是一个脚本,它可以在任何地方使用,您可以在您的组件中访问它:

      export class MyComponent{
      
      
          ngOnInit(){
              console.log('colour is : '+window['configuration.whatEver']); // obviously you can improve this and create type definitions and what not.
          }
      }
      

      这将使您在将来更新配置时更加灵活,而无需重新构建您的应用。

      显然,您可以通过 Ajax 调用进行相同的调用,但我发现上面的调用与应用程序无关。

      【讨论】:

        【解决方案3】:

        可以使用@angular/cli创建多个配置文件。

        docs提到的自定义配置文件可以通过以下方式添加:

        • 创建一个src/environments/environment.NAME.ts
        • { "NAME": 'src/environments/environment.NAME.ts' } 添加到.angular-cli.json 中的apps[0].environments 对象
        • 通过构建/服务命令上的--env=NAME 标志使用它们。

        因此,您可能需要 6 个用于 dev 的配置文件和 6 个用于 prod 的配置文件。

        然后要访问这些变量,只需从 environment.ts 文件中导入环境对象。

        【讨论】:

        • 它用于添加新环境而不传递参数。我的参数范围可以从 -360 到 + 360。我不能为每个值创建一个环境。
        • @Arashsoft,你不能用建议的方法解决你的问题并不意味着答案是错误的:) 如果你可以发布一个单独的问题来描述你想要实现的目标,我可以有一个看。
        • 问题很明确:“我可以在构建时将参数传递给 angular-cli”。它不是关于创造环境。这是关于传递参数的,这篇文章没有回答这个问题。
        • 答案是错误的。 OP 询问是否可以在构建时(即 ng build)将参数传递给 CLI,以及是否可以在运行时检索这些参数。我现在正在查看完全相同的内容,以便在我的 CD 环境中自动将内部版本号包含在我的代码中(而不是使用 hacky 方式用脚本替换环境变量)。
        • 不是解决方案 env 文件不是参数。您如何管理机密?
        猜你喜欢
        • 2013-12-28
        • 1970-01-01
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        相关资源
        最近更新 更多