angular / angular/angular-cli

Angular Schematics - Apply thousands of changes on tree cause error "Maximum call stack size exceeded"

オープン
#17,851 コメント 1 件 リアクション 3 件 担当者 0 名 GitHub で見る
area: @angular-devkit/schematics freq1: low severity3: broken type: bug/fix
主要言語
TypeScript
スター
27k
フォーク
11.8k
平均マージ
14時間 23分
マージ済み PR(30日)
162

説明

# 🐞 Bug report

### Description

I use Angular Schematics to migrate from AngularJs to Angular. The application is a large one with thousands of page. I try to create a component for each page based on a template. When I try to create the component on a smaller project like 200 pages it's working but when I fall on a large one with more than 1000 pages (1000 schematics rules)

## 🔬 Minimal Reproduction



export function createPageComponents(options: any): Rule {
return (tree: Tree, context: SchematicContext) => {
const logger = context.logger;
const directory = tree.getDir('my_path/pages');

const rules: Rule[] = [];
directory.visit((filePath) => {
if (!filePath.endsWith('config.ts')) {
return;
}

const dirPath = dirname(filePath);
const parsedPath = parseName(dirPath, basename(filePath).split('.')[0]);
options = {
path: parsedPath.path,
name: parsedPath.name
};

const templateSource = apply(
url('./files'),
[
applyTemplates({
...strings,
...options
}),
move(parsedPath.path)
]
);

const rule = mergeWith(templateSource);

rules.push(rule);
});

return chain(rules);
};
}

## 🔥 Exception or Error



RangeError: Maximum call stack size exceeded
at Console.warn ()
at Observable._trySubscribe (my_path\node_modules\rxjs\internal\Observable.js:55:25)
at Observable.subscribe (my_path\node_modules\rxjs\internal\Observable.js:30:22)
at MergeMapOperator.call (my_path\node_modules\rxjs\internal\operators\mergeMap.js:39:23)
at Observable.subscribe (my_path\node_modules\rxjs\internal\Observable.js:25:31)
at MapOperator.call (my_path\node_modules\rxjs\internal\operators\map.js:32:23)
at Observable.subscribe (my_path\node_modules\rxjs\internal\Observable.js:25:31)
at MapToOperator.call (my_path\node_modules\rxjs\internal\operators\mapTo.js:26:23)
at Observable.subscribe (my_path\node_modules\rxjs\internal\Observable.js:25:31)
at DefaultIfEmptyOperator.call (my_path\node_modules\rxjs\internal\operators\defaultIfEmpty.js:27:23)

## 🌍 Your Environment



Angular CLI: 9.1.4
Node: 10.19.0
OS: win32 x64

Angular: 9.1.4
... animations, cli, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router
Ivy Workspace: Yes

Package Version
------------------------------------------------------------
@angular-devkit/architect 0.901.4
@angular-devkit/build-angular 0.901.4
@angular-devkit/build-ng-packagr 0.901.4
@angular-devkit/build-optimizer 0.901.4
@angular-devkit/build-webpack 0.901.4
@angular-devkit/core 9.1.4
@angular-devkit/schematics 9.1.7
@angular-devkit/schematics-cli 0.901.7
@angular/upgrade 9.1.9
@ngtools/webpack 9.1.4
@schematics/angular 9.1.4 (cli-only)
@schematics/schematics 0.901.7
@schematics/update 0.901.4
ng-packagr 9.1.3
rxjs 6.5.5
typescript 3.8.3
webpack 4.42.0

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

再現コードの createPageComponents エントリポイントから始め、特に rules 配列と chain(rules) を確認し、1,000 件を超える Schematics ルールで失敗を再現します。レポートに示されている RxJS のスタックトレースと併せて、Angular Schematics の実行パスを読みます。大量のページコンポーネント変更を maximum call stack エラーなしで適用できれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
angular, typescript
領域
cli, tooling
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。