【问题标题】:How to change the template file(s) for an existing nx schematic如何更改现有 nx 原理图的模板文件
【发布时间】:2020-01-30 15:27:35
【问题描述】:

我最近开始使用https://nx.dev/ 来重组现有的具有多个反应前端和redux 状态管理的monorepo。

nx 提供了使用@nrwl/react:redux 原理图开箱即用创建新redux 切片的能力,例如:nx g @nrwl/react:redux <sliceName>。这很棒!但是,用于创建新文件的模板不符合我的需要(例如我不使用 redux-thunk...),我想使用自己的模板。

我使用nx g workspace-schematic redux-module 创建了一个新的自定义原理图,并对其进行了调整以扩展@nrwl/react:redux,例如:

import { chain, externalSchematic, Rule } from '@angular-devkit/schematics';

export default function(schema: any): Rule {
  return chain([
    externalSchematic('@nrwl/react', 'redux', {
      name: schema.name
    })
  ]);
}

谁能告诉我如何从这里着手使自定义原理图使用我自己的模板文件?

谢谢!

【问题讨论】:

    标签: reactjs redux monorepo nrwl nomachine-nx


    【解决方案1】:

    您可以将模板文件放在目录中,加载它们然后复制到目标destination.e.g.

    目录结构:

    Project_root
    |- tools
       |- schematics
          |- your_schematics
             |- index.ts  
             |- templates
                |- __name@dasherize__.custom.ts
    

    内容:

    /* __name@dasherize__.custom.ts */
    
    export class <%= classify(name) %>Custom {
        constructor () {}
    }
    
    /* index.ts */
    
    import { chain, externalSchematic, Rule, url, apply, move, mergeWith, MergeStrategy, template, SchematicContext } from '@angular-devkit/schematics';
    import { dasherize, classify } from '@angular-devkit/core/src/utils/strings';
    import { normalize, strings } from '@angular-devkit/core';
    
    
    export default function(schema: any): Rule {
      const libFileName = dasherize(schema.name);
      const projectDirectory = schema.directory
        ? normalize(schema.directory + '/' + libFileName)
        : libFileName;
      const projectRoot = normalize('libs/' + projectDirectory);
    
      return chain([
         externalSchematic('@nrwl/workspace', 'lib', schema),
         addCustomFileToLib(schema, projectRoot)
      ]);
    }
    
    function addCustomFileToLib(schema: any, projectRoot: string): Rule {
      const templateFiles = url("./templates");
      const newTree = apply(templateFiles, [
        move(projectRoot),
        template({
          ...strings,
          ...schema // pass the objects containing the properties & functions to be used in template file
        })
      ]);
      return mergeWith(newTree, MergeStrategy.Default);
    }
    

    注意:模板文件的名称(__name@dasherize__.custom.ts) 是一个表达式,将根据执行原理图时从 cli 传递的 name 参数进行编译/更改。

    【讨论】:

    • 谢谢!我会试一试并报告。不幸的是,此刻有点忙于其他事情......
    猜你喜欢
    • 2019-08-27
    • 2020-02-17
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2016-09-07
    相关资源
    最近更新 更多