Схемы - Управление ошибками копирования файлов шаблонов - PullRequest
1 голос
/ 11 марта 2020

Мне удается скопировать некоторые файлы из каталога schematics files в целевую папку основного проекта:

function addTplFiles(path: string): Source {
  // copy templates
  return apply(url('./files'), [
    move(path as string)
  ]);
}

export function ngAdd(options: ISchema): Rule {
  return (host: Tree/*, context: SchematicContext*/) => {
    // get the workspace config of the consuming project
    // i.e. angular.json file
    const workspace = getWorkspace(host);
    // identify the project config which is using our library
    // or default to the default project in consumer workspace
    const project = getProjectFromWorkspace(
      workspace,
      options.project || workspace.defaultProject
    );
    const projectType = project.projectType === 'application' ? 'app' : 'lib';
    const path = (options.path === undefined) ? `${project.sourceRoot}/${projectType}` : options.path;

    const templateSource = addTplFiles(project.sourceRoot || '');

    // return updated tree
    try {
      return chain([
        mergeWith(templateSource)
      ]);
    } catch (e) {
      return host;
    }
  };

Код работает хорошо, за исключением случаев, когда файлы уже находятся в основном проекте приложения. :

ОШИБКА! src / assets / i18n / en. json уже существует. ОШИБКА! src / assets / i18n / it. json уже существует. Рабочий процесс Schemati c не выполнен. См. Выше.

Как я могу поймать и обработать это исключение?

1 Ответ

2 голосов
/ 23 марта 2020

У вас есть 2 варианта:

  • использовать опцию --force с вашей командой schematics, чтобы принудительно перезаписать все существующие файлы.
  ng g @custom/my-schematics:rule --force
  • check если файл уже существует в коде вашей схемы, и примените специфическое c поведение в этом случае.
const templateSource = apply(url('./files'), [
  forEach((fileEntry: FileEntry) => {
    if (tree.exists(fileEntry.path)) {
      console.log('File already exists, but it\'s ok');
      return null;
    }
    return fileEntry;
  })
]);

return chain([
  mergeWith(templateSource)
]);
...