Как вызвать ng add из внешней схемы

Мне нужна помощь в вызове ng add для внешней угловой схемы. (Я пытаюсь добавить нг-импульс: https://github.com/BottleRocketStudios/ng-momentum) Я пытаюсь вызвать "нг добавить нг-импульс" из пользовательского интерфейса командной строки, но я столкнулся с проблемами, когда модуль "нг-импульс" не найден.

Я пытался вызвать метод externalSchematic из @angular-devkit/schematics несколькими различными способами, но чего-то не хватает.

Несколько разных реализаций, которые я пробовал:

return chain([
  externalSchematic('ng-momentum', 'scaffold', { 
   project: options.project,
 })

а также

return chain([
  externalSchematic('ng-momentum', 'ng-add', {
  }),
  externalSchematic('ng-momentum', 'scaffold', {
    spec: false,
    force: true,
  })

также как и

return chain([
  externalSchematic('ng', 'add', {
   project: options.project,
   package: 'ng-momentum',
 })

но я всегда получаю ту же ошибку, как описано ниже

Шаги воспроизведения
1) Запустите "npm i @lcu/cli -g" для установки пользовательского интерфейса командной строки
2) Создайте новую пустую папку, перейдите к ней
3) Запустите команду "lcu init". Назовите область действия "@scope" и рабочую область "test".
4) В той же папке выполните команду "lcu proj newProject", выберите "App". Выберите "Импульс"

Ожидаемое поведение: следуя инструкциям ng-импульса, если я создаю новый угловой проект (ng new newProject), а затем запускаю ng add (ng add ng -mentum) вне CLI, я получаю новый угловой проект и ng- приложение импульса.

Фактическое поведение: я получаю следующую ошибку: "Не удалось найти модуль"ng-momentum"из"C:\wherever\your\project\is"".

Кажется, я что-то упустил, но не совсем уверен, что. Пожалуйста, дайте мне знать, если нужна дополнительная информация, или если есть какие-либо вопросы.

Заранее спасибо!

0 ответов

Я попадаю в ту же проблему и нахожу для нее решение.

Проблема в том, чтобы запустить ng-momentum:ng-add schematic вам нужно будет установить пакет перед этим, а также ng add сделай это для нас.

Итак, вам нужно будет разбить вашу схему на два этапа: установить зависимости и ваше фактическое правило.

Взгляните на правило, которое запрашивает установку пакета, и поставьте свое правило в очередь.


export functions dependencies(options): Rule: Rule {
    return (_tree: Tree, context: SchematicContext) => {
        const installTaskId = context.addTask(new NodePackageInstallTask({
            packageName: 'ng-momentum'
        }));

        context.addTask(new RunSchematicTask('after-dependencies', options), [installTaskId]);
    }
}

Не бойтесь, ваш пользователь этого не увидит, если вы настроите свои коллекции таким образом.


{
    "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
    "schematics": {
        "your-rule": {
            "factory": "./what-ever/index#dependencies",
            "schema": "./what-ever/schema.json"
        },
        "after-dependencies": {
            "factory": "./what-ever/index#yourRule",
            "schema": "./what-ever/schema.json",
            "private": true,
        }
    }
}


Что ж, извините за задержку (9 месяцев), лучше, чем никогда.

С уважением,
Бернардо Баумблатт

Я боролся с вызовом externalSchematic из настраиваемой схемы добавления, и на самом деле библиотека, которую вы хотите вызвать из своего ng add, ДОЛЖНА быть установлена ​​локально в вашем корневом package.json.

Вызов externalSchematic ищет package.json, и если он не установлен в корневом проекте схемы, он не будет работать.

Надеюсь, это связано с этой проблемой!

Другие вопросы по тегам