Angular CLI build - показывать уведомления о состоянии сборки - PullRequest
2 голосов
/ 07 марта 2019

У меня возникла довольно интересная проблема, когда я пытался добавить плагин webpack-notifier в совершенно новое приложение Angular 7. Идея состояла в том, чтобы ng build --watch работал в консоли и имел всплывающие уведомления, если текущая сборка не удалась (или восстановлена ​​из состояния сбоя).

TL; DR;

При запуске ng build --watch массив ошибок для веб-пакета done ловушка компилятора может быть пустым, даже если сборка не удалась. Есть ли обходной путь для этого, если мне нужен массив ошибок, чтобы показать уведомление о сломанной сборке?


Теперь подробности.

Сначала я создал новый проект Angular, используя ng new my-app Затем я добавил пользовательскую конфигурацию веб-пакета, следуя инструкциям ngx-build-plus из здесь . Затем я взял webpack-notifier source и использовал его в webpack.partial.js как

module.exports = {
    plugins: [
        new WebpackNotifierPlugin()
    ]
}

Давайте попробуем: ng build --watch --extra-webpack-config webpack.partial.js

Хорошо, все работает нормально, давайте разберем сборку, добавив немного чепухи, скажем, в app.component.ts. Как и ожидалось, я вижу ошибку в консоли и всплывающее уведомление с помощью плагина уведомлений. Теперь я возвращаю взломанные изменения обратно, жду, пока сборка станет зеленой, и снова добавлю разрывающие изменения .

В результате в консоли появляется сообщение об ошибке, но всплывающее уведомление об ошибке не отображается.

Пойдем глубже. WebpackNotifierPlugin использует ловушки компилятора webpack:

WebpackNotifierPlugin.prototype.apply = function(compiler) {
  if (compiler.hooks) {
    var plugin = { name: 'Notifier' };

    compiler.hooks.done.tap(plugin, this.compilationDone.bind(this));
  } else {
    compiler.plugin('done', this.compilationDone.bind(this));
  }
};

WebpackNotifierPlugin.prototype.compilationDone = function(stats) {
  // read the stats and show the message
}

Webpack done hook имеет один stats параметр, и плагин уведомителя ожидает, что массив stats.compilation.errors будет содержать, ну, в общем, ошибки. Но если я запишу это на выходе:

WebpackNotifierPlugin.prototype.compilationDone = function(stats) {
    console.log('Errors: ')
    console.info(stats.compilation.errors);
};

получается, что stats.compilation.errors может быть пустым, даже если в консоли есть ошибки:

enter image description here

Есть ли у вас какие-либо идеи о причине такого поведения и есть ли обходной путь?

1 Ответ

0 голосов
/ 13 марта 2019

Причина такого поведения заключается в том, что средство проверки разветвленных типов не передает семантические ошибки по линии. В качестве обходного пути можно добавить "forkTypeChecker": false к параметрам сборки (его проекты. [App-name] .achitect.build.options часть angular.json)

Чуть более подробное описание можно найти в трекере ошибок Angular CLI: https://github.com/angular/angular-cli/issues/13870

...