Angular CLI 自定义构建器。

16

Angular CLI 6引入了新的构建器(也称为Architect Targets)的概念。
有几个预先构建的构建器@angular-devkit/build-angular一起提供,但不幸的是没有文档说明如何创建自己的构建器。

我该如何创建自己的构建器(例如修改基础webpack配置)?

3个回答

17

更新:

如需 Angular 8+ 的相关信息,请参阅 AngularInDepth 文章

对于 Angular 6 和 7:

完整文章可在 此处找到。

为简单起见,我假设新的构建器是用 TypeScript 实现的,但也可以使用纯 JavaScript 实现。

实现:

  1. 在项目根目录下创建一个自定义构建器的目录(例如 custom-builders),或将其作为本地 npm 模块安装。
  2. 在该目录中创建一个名为 builders.jsonindex.tspackage.json 的文件,其中包含指向 builders.jsonbuilders 条目。
  3. custom-builders 中创建一个要实现的构建器的目录(例如,custom-builders/my-cool-builder)。
  4. my-cool-builder 目录中添加 index.tsschema.jsonschema.d.ts
  5. 使用你的构建器选项的模式填充 schema.json。请参见此处的示例。
  6. 根据你定义的 schema.json,定义你的 schema.d.ts。请参见此处的示例。
  7. my-cool-builder/index.ts 中实现你的构建器。构建器必须实现以下接口:

    export interface Builder<OptionsT> {
      run(builderConfig: BuilderConfiguration<Partial<OptionsT>>):  Observable<BuildEvent>;
    }
    

    BuildEvent是这样的:

    export interface BuildEvent {
      success: boolean;
    }
    

    BuilderConfiguration 是这样的:

    export interface BuilderConfiguration<OptionsT = {}> {
      root: Path;
      sourceRoot?: Path;
      projectType: string;
      builder: string;
      options: OptionsT;
    }
    

    OptionsT 是您在 schema.d.ts 中为构建器选项定义的接口。

    您可以使用 browser 架构目标作为参考。

  8. 实现后,将您的构建器添加到 builders.json 中:

  9. {
      "$schema": "@angular-devkit/architect/src/builders-schema.json",
      "builders": {
        "cool-builder": {
          "class": "./my-cool-builder",
          "schema": "./my-cool-builder/schema.json",
          "description": "My cool builder that builds things up"
        }
      }
    }
    

用法:

在您的 angular.json 文件中:

    "architect": {
        ...
        "build": {
                  "builder": "./custom-builders:cool-builder"
                  "options": {
                         your options here
                  }

示例

查看完整示例,请访问此库:https://github.com/meltedspark/angular-builders


我曾经尝试使用本地定义的构建器来实现这个功能,但最终还是创建了一个演示库:https://github.com/Roaders/angular-electron-chrome/tree/js-custom-builder。不幸的是,我无法使用 TypeScript 构建器(没有额外的编译步骤)来实现它。 - Roaders
你的困难是什么? - JeB
@Roaders,我想命令行界面工具还没有设置自动编译的选项,如果类构建器是TypeScript文件,就无法编译了吧? - Mike Haas

1

0

我没有测试过,也不太确定,但这个概念可能是解决方案。

architect.build.builder 使用一些 Angular schematics 来执行构建过程。您可以创建自己的 schematics,使用/继承常规构建 schematics,并添加您想要实现的其他逻辑。


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