Angular CLI 自定义构建器

Posted

技术标签:

【中文标题】Angular CLI 自定义构建器【英文标题】:Angular CLI custom builder 【发布时间】:2018-12-06 17:36:27 【问题描述】:

Angular CLI 6 引入了构建器的新概念(又名 Architect Targets)。@angular-devkit/build_angular 附带了几个 prebuilt builders,但遗憾的是没有说明如何创建自己的构建器的文档。

如何创建自己的构建器(例如修改底层 webpack 配置)?

【问题讨论】:

【参考方案1】:

更新:

对于 Angular 8+,请阅读 thisAngularInDepth 文章。

对于 Angular 6 和 7:

全文可以在here找到。

为了简单起见,我假设新的构建器是用 Typescript 实现的,但它也可以用纯 javascript 实现。

实施:

    在项目的根目录中为您的自定义构建器(例如 custom-builders)创建一个目录(或者将其安装为 local npm module) 在目录中创建一个名为 builders.jsonindex.tspackage.json 的文件,其中包含指向的 builders 条目builders.jsoncustom-builders 中为您要实现的构建器创建一个目录(例如,custom-builders/my-cool-builderindex.tsschema.jsonschema.d.ts 添加到 my-cool-builder 目录 使用构建器选项的架构填充 schema.json。查看示例here。 根据您定义的 schema.json 定义您的 schema.d.ts。查看示例here。

    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架构师目标作为参考。

    实施后,将您的构建器添加到 builders.json

    
      "$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

【讨论】:

我很难使用本地定义的构建器来实现它,所以我创建了一个 repo 来演示它:github.com/Roaders/angular-electron-chrome/tree/…。不幸的是,我无法让它与打字稿生成器一起工作(没有额外的编译步骤) 你到底在挣扎什么? @Roaders 是的,我想 CLI 工具没有设置为自动编译如果类生成器是打字稿文件?【参考方案2】:

对于使用 Angular 8 及更高版本的用户,现在正式支持并记录了构建器 API:https://angular.io/guide/cli-builder

与以前的版本相比,它有很多变化,因此如果您使用未记录的 Architect API,从 Angular 7 迁移到 8 可能会变得复杂。

这是一篇不错的入门文章:https://blog.angular.io/introducing-cli-builders-d012d4489f1b

【讨论】:

【参考方案3】:

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

architect.build.builder 使用一些 Angular 原理图来执行构建过程。您可以创建自己的原理图,使用/继承常规构建原理图以及您想要实现的附加逻辑。

【讨论】:

以上是关于Angular CLI 自定义构建器的主要内容,如果未能解决你的问题,请参考以下文章

如何创建自定义原理图以构建新的 Angular 项目

angular-cli 自定义原理图/集合

angular2-cli 包含自定义字体

Xamarin Forms Shell 如何使用自定义渲染器自定义选项卡

Google 跟踪代码管理器自定义变量返回未定义

在 angular-cli 中打印自定义原理图日志