ClassOptions Schema - Angular Schematics

Posted

技术标签:

【中文标题】ClassOptions Schema - Angular Schematics【英文标题】: 【发布时间】:2019-06-21 16:41:59 【问题描述】:

在 @angular-devkit/schematics readme 中,我对 ClassOptions 的作用感到困惑。

如果将代码添加到项目中,则会显示错误,因为该文件不存在。

想知道这是做什么用的 + 一个例子?

import  strings  from '@angular-devkit/core';
import 
  Rule, SchematicContext, SchematicsException, Tree,
  apply, branchAndMerge, mergeWith, template, url,
 from '@angular-devkit/schematics';
import  Schema as ClassOptions  from './schema';

export default function (options: ClassOptions): Rule 
  return (tree: Tree, context: SchematicContext) => 
    if (!options.name) 
      throw new SchematicsException('Option (name) is required.');
    

    const templateSource = apply(
      url('./files'),
      [
        template(
          ...strings,
          ...options,
        ),
      ]
    );

    return branchAndMerge(mergeWith(templateSource));
  ;
 

【问题讨论】:

【参考方案1】:

示例中的schema 文件是在build process 在angular-cli 中使用this function 生成的打字稿文件。这是angular-cli 中使用的模式,该示例无法正常工作。您可以在service 等官方角度示意图之一中查看此类示意图的完整示例。

但请记住,ClassOptions 只是一个指定 Angular Schematic 选项的对象。它可以来自任何地方,并且与原理图库分离。 responsibility of the tooling 为原理图库提供选项。

这是一个使用reference cli 的类似示例。

生成一个简单的示意图:

schematics blank --name=test

将架构文件的路径添加到collection.json


  "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
  "schematics": 
    "test": 
      "description": "A blank schematic.",
      "factory": "./test/index#test",
      "schema": "./test/schema.json"
    
  

创建schema.json:


    "$schema": "http://json-schema.org/schema",
    "id": "MySchema",
    "title": "My Schema",
    "type": "object",
    "properties": 
        "name": 
            "type": "string",
            "default": "cactus"
        
    

index.ts 中的工厂现在将从schema.json 文件中传递默认选项。

import  Rule, SchematicContext, Tree  from "@angular-devkit/schematics";

// You don't have to export the function as default. You can also have more than one rule factory
// per file.
export function test(_options: any): Rule 
    return (tree: Tree, _context: SchematicContext) => 
        tree.create(_options.name || "hello", "world");
        return tree;
    ;

使用 schema.json 的默认值运行 cli:

schematics .:test --dry-run=false
...
CREATE /cactus (5 bytes)

使用用户定义的选项运行 cli:

schematics .:test --name=bean--dry-run=false
...
CREATE /bean (5 bytes)

【讨论】:

以上是关于ClassOptions Schema - Angular Schematics的主要内容,如果未能解决你的问题,请参考以下文章

C第六课

C第九课

C第五课

C第二课

C第一课

C第十三课