Как изменить файл (ы) шаблона для существующей схемы nx - PullRequest
0 голосов
/ 01 октября 2019

Я недавно начал использовать https://nx.dev/ для реорганизации существующего монорепо с множеством реагирующих внешних интерфейсов и управлением состоянием редукса.

nx предоставляет возможность создавать новые срезы редукса из коробки, используя @nrwl/react: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
    })
  ]);
}

Может кто-нибудь сказать мне, как действовать дальше, чтобы пользовательская схема использовала мои собственные файлы шаблонов?

Спасибо!

1 Ответ

0 голосов
/ 06 октября 2019

Вы можете иметь файлы шаблонов внутри каталога, загрузить их и затем скопировать в целевое назначение. Например:

Структура каталога:

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) - это выражение, которое будет скомпилировано / изменено в соответствии с аргументом name , переданным извыполнение схем.

...