【问题标题】:Is there a way to extend configurations in angular.json?有没有办法在 angular.json 中扩展配置?
【发布时间】:2018-08-28 15:42:45
【问题描述】:

在构建我的 Angular 6 应用程序时,我需要同时指定 2 件事:

  • 如果是生产或开发版本
  • 我正在使用的语言环境

在我的angular.json 我有:

"build": {
  ...
  "configurations": {
    "production": {
      "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        }
      ],
      "optimization": true,
      "outputHashing": "all",
      "sourceMap": false,
      "extractCss": true,
      "namedChunks": false,
      "aot": true,
      "extractLicenses": true,
      "vendorChunk": false,
      "buildOptimizer": true
    },
    "pl": {
      "fileReplacements": [
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/pl.json"
        }
      ]
    },
    "en": {
      "fileReplacements": [
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/en.json"
        }
      ]
    }
  }
}

但是当我在做ng build --configuration=en --configuration=production 时,我收到了一个错误Configuration 'en,production' could not be found。我理解这意味着您一次只能指定 1 个配置。

这意味着我需要创建单独的enplproductionEnproductionPl 配置。虽然不是最干净的模式,但我可以接受。

"build": {
  ...
  "configurations": {
    "production": {
      "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        }
      ],
      "optimization": true,
      "outputHashing": "all",
      "sourceMap": false,
      "extractCss": true,
      "namedChunks": false,
      "aot": true,
      "extractLicenses": true,
      "vendorChunk": false,
      "buildOptimizer": true
    },
    "pl": {
      "fileReplacements": [
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/pl.json"
        }
      ]
    },
    "en": {
      "fileReplacements": [
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/en.json"
        }
      ]
    },
    "productionPl": {
      "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        },
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/pl.json"
        }
      ],
      "optimization": true,
      "outputHashing": "all",
      "sourceMap": false,
      "extractCss": true,
      "namedChunks": false,
      "aot": true,
      "extractLicenses": true,
      "vendorChunk": false,
      "buildOptimizer": true
    },
    "productionEn": {
      "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        },
        {
          "replace": "src/assets/i18n/translations.json",
          "with": "src/assets/i18n/en.json"
        }
      ],
      "optimization": true,
      "outputHashing": "all",
      "sourceMap": false,
      "extractCss": true,
      "namedChunks": false,
      "aot": true,
      "extractLicenses": true,
      "vendorChunk": false,
      "buildOptimizer": true
    }
  }
}

但我不能忍受的是复制并粘贴整个production 配置内容到productionEnproductionPl。如果我添加更多的语言环境,或者我想在构建期间指定的第三个独立方面,那么这种模式将成为维护的噩梦。不幸的是,这似乎是 Angular 团队在他们的 documentation 中推荐的模式。

有没有办法告诉 Angular CLI productionEn 扩展了 production,所以不要多次复制相同的配置代码?类似于下面的代码:

"build": {
  ...
  "configurations": {
    "production": {
      (...)
    },
    "pl": {
      "extends": "production",
      (...)
    },
    "en": {
      "extends": "production",
      (...)
    }
  }
}

【问题讨论】:

  • 你不能简单地省略等于的值吗?我认为您只能添加“outputPath”、“i18nFile”、“i18nFormat”、“i18nLocale”和“i18nMissingTranslation”的键,但我不确定
  • @Eliseo 我不明白你的意思。由于我在构建过程中只能设置 1 个配置,因此我需要指定所有值;看不出我可以省略什么。
  • 也许您有拼写错误? Configuration 'en,productions' could not be found 但您的配置名称是 production 没有 s。
  • @ngfelixl:很好,但不幸的是,这只是我在编辑帖子时打错了。我再次对其进行了测试,但它不起作用,产生en,production 而不是en,productions 的错误。我更正了帖子。

标签: json angular angular-cli


【解决方案1】:

终于有办法了,在命令行中指定多个配置:

ng build --configuration=en,production

Relevant issue in Angular repo

注意--prod 标志在使用--configuration 时会被忽略(因此您需要将production 显式添加到配置列表中)。

Angular docs--configuration=configuration

命名的构建目标,在 angular.json 的“配置”部分中指定。每个命名的目标都伴随着该目标的选项默认配置。显式设置它会覆盖“--prod”标志

别名:-c

【讨论】:

  • 不错的一个!谢谢! :)
  • 你知道哪个版本的 Angular 可用吗?我目前使用 angular core 8.2.14 和 angular cli 8.3.20,但无法正常工作。
  • @ArchiFloyd 发布历史显示它在9.0.0-next.10 中可用。我不确定-next.10 到底是什么意思,但它似乎只能在9.0.0 中使用。
  • 我想知道它是如何工作的说:ng serve --configuration=en,myenv 它说:Configuration 'en,myenv' is not set in the workspace.
  • @Agoun:你确定你使用的是支持它的版本吗?在我看来,您仍在使用旧的,语法不受支持,因此逗号被解释为配置名称的一部分。
【解决方案2】:

更新:查看使用多种配置进行构建的公认答案。以下详细信息现已过时


阅读一些问题和angular.json 文档,options 似乎是项目的默认值

"architect": {
        "build": {          
          "options": {...}

这些被configurations 中设置的partial 选项覆盖。来自Angular CLI workspace wiki

configurations (object): A map of alternative target options.
configurationName (object): Partial options override for this builder.

这个issue comment 还提到使用configurations 作为替代

这听起来像是项目的所有默认值都可以添加到 options 对象中,例如将所有重复项从 productionproductionPl 移动到 options: {},然后添加 fileReplacements,以及您需要的其他几个覆盖

注意:我尚未对此进行测试,这只是基于文档和问题的建议

【讨论】:

  • 我没有从文档中得到很多信息,谢谢!有那么一刻,我以为它会解决这个问题,但我意识到一个问题。将常用选项从build.configurations.production 移动到build.options 意味着每个ng build 都将是一个生产版本。这是不希望的,因为ng build 也被例如ng serve 调用(它在angular.jsonserve.browserTarget 选项中定义)并且这些构建不需要执行生产构建所做的所有处理。所以production 模式肯定需要开启和关闭,而不是默认的。
  • @RobertKusznier 在所有这些配置之间有很多相同的选项,因此您可以将它们移至默认值,不是吗?这就是extends 功能在任何情况下都可以做的事情
  • 但是如果我将它们移动到options,它们也会在运行开发服务器时应用(因为它也在运行ng build,只是没有--prod/--configuration=production)。这是完全不希望的。你知道如何处理/解决这个问题吗?
  • @RobertKusznier 据我所知,除了向默认选项添加值并在配置中覆盖它们之外,没有进一步的仅限 CLI 的解决方案。你真正要找的是extends,这是一个功能请求(但我想这很可能:见priority 3 nice to havegithub.com/angular/angular-cli/issues/10612
  • 所以这是一个功能请求!阅读这些问题后,我现在确信我所要求的到目前为止根本不可能实现。感谢您提供所有这些有用的资源:)。
【解决方案3】:

但这不适用于你说的ng serve

可能发生的情况如下:

首先,这是我对angular12/architect/build/configurations 的配置:

"development": {

    "customWebpackConfig": {
       "path": "custom-webpack.dev.config.js",
       "replaceDuplicatePlugins": true
    },

    "buildOptimizer": false,
    "optimization": false,
    "vendorChunk": true,
    "extractLicenses": false,
    "sourceMap": false,
    "namedChunks": true,
    "aot": true
},

"quick": {

    "fileReplacements": [
        {
            "replace": "src/app/app-routing.module.ts",
            "with": "src/app/app-routing.module.quick.ts"
        }
    ]
}

我有一个标准的开发配置,除了 development 的选项之外,还有一个名为 quick 的附加配置。

(所以我的quick 与OP 的enpl 相同。)

抱歉,这不是一个神奇的新“快速 Angular 构建”功能(!) - 我只是复制了我的 app-routing 文件,注释掉了除了我目前正在使用的每个惰性模块并配置了fileReplacements 覆盖标准文件的选项。对于大型项目,构建速度明显更快。显然,虽然我不想意外部署它,但这就是我需要单独配置的原因。

当您运行ng serve --configuration development,quick 时会发生什么,它会查看配置的 serve 部分(如下)。如您所见,我在此处添加了quick 作为浏览器目标,引用了我上面的内容。

"serve": 
{
    "builder": "@angular-builders/custom-webpack:dev-server",

    "options": {
       "browserTarget": "angular12:build"
    },

    "configurations": 
    {
       "production": {
          "browserTarget": "angular12:build:production"
       },
       "development": {
          "browserTarget": "angular12:build:development"
       },
       "quick": {
          "browserTarget": "angular12:build:quick"
       }
    },
    "defaultConfiguration": "development"
},

当您询问--configuration development,quick 时实际发生的情况是它合并了这两个节点:

"development": {
   "browserTarget": "angular12:build:development"
}

"quick": {
   "browserTarget": "angular12:build:quick"
}

结果:

"development": {
   "browserTarget": "angular12:build:development"
}

现在理解为什么它不起作用 :-)

解决办法:

幸运的是,解决方案很简单,只需将serve/quick 更新为:

"quick": {
     "browserTarget": "angular12:build:development,quick"
}

然后简单地运行:

ng-serve --configuration quick

这将反过来将您的developmentquick 配置合并到architect/build 下,就像您在运行ng build 一样。


PS。你可能会看到我正在使用customWebpackConfig。那就是允许自定义的@angular-builders/custom-webpack 包。这与我的回答无关,但让我向自己证明它确实有效,因为我能够观察到我的 customWebpack 插件都在运行,并且只构建了我想要的单个惰性块。

【讨论】:

  • 在我发现这个之后我发现了另一种方法。见github.com/angular/angular-cli/issues/17473。您可以像这样直接使用browser-targetng serve --browser-target angular12:build:development,quick。它实际上在做同样的事情,但我更喜欢我的方式。它更快;-)
【解决方案4】:

你问的是什么?

"scripts": {
    [...]
    "build-i18n": "for lang in en es fr pt; 
       do ng build --config=$lang;
       done"
 }

【讨论】:

  • 如何同时构建所有语言不是我的问题。而不是我问的是如何构建一种特定的语言,比如说en,使用production 配置? ng build --configuration=en --configuration=production 之类的东西,但这不起作用。
猜你喜欢
  • 2021-08-25
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多