Как изменить файл (ы) шаблона для существующей схемы nx
Недавно я начал использовать https://nx.dev/, чтобы реорганизовать существующий монорепозиторий с несколькими интерфейсами реагирования и управлением состоянием редукции.
nx предоставляет возможность создавать новые срезы redux из коробки, используя @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 ответ
Вы можете иметь файлы шаблонов внутри каталога, загружать их, а затем копировать в целевое место назначения. Например
Структура Dir:
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
) - это выражение, которое будет скомпилировано / изменено в соответствии с именем arg, переданным из cli при выполнении схемы.