Content-Length: 716980 | pFad | https://github.com/angular/angular/commit/9241615ad0825156f4bf31bc4308372e4789e902

29 fix(core): reduce total memory usage of various migration schematics … · angular/angular@9241615 · GitHub
Skip to content

Commit 9241615

Browse files
JoostKatscott
authored andcommitted
fix(core): reduce total memory usage of various migration schematics (#60776)
This commit changes Tsurge's operation within angular-devkit (i.e. the CLI) to no longer retain all programs across all migrations. This isn't necessary for so-called "funnel" migrations so not retaining the programs for those migrations is a pure performance win. The "complex" migrations may see increased execution time given that the program is now being recreated for the actual migration phase to run, although reduced memory pressure may help alleviate this overhead. Since this new approach should help prevent Node from running out of memory and failing entirely this is preferred over a potentially increased execution time. Fixes #59813 PR Close #60776
1 parent a382066 commit 9241615

File tree

6 files changed

+58
-25
lines changed

6 files changed

+58
-25
lines changed

packages/core/schematics/ng-generate/cleanup-unused-imports/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,20 @@
77
*/
88

99
import {Rule} from '@angular-devkit/schematics';
10+
import {MigrationStage, runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
1011
import {UnusedImportsMigration} from './unused_imports_migration';
11-
import {runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
1212

1313
export function migrate(): Rule {
1414
return async (tree, context) => {
1515
await runMigrationInDevkit({
1616
getMigration: () => new UnusedImportsMigration(),
1717
tree,
18-
beforeProgramCreation: (tsconfigPath) => {
19-
context.logger.info(`Preparing analysis for ${tsconfigPath}`);
18+
beforeProgramCreation: (tsconfigPath, stage) => {
19+
if (stage === MigrationStage.Analysis) {
20+
context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
21+
} else {
22+
context.logger.info(`Running migration for: ${tsconfigPath}...`);
23+
}
2024
},
2125
beforeUnitAnalysis: (tsconfigPath) => {
2226
context.logger.info(`Scanning for unused imports using ${tsconfigPath}`);

packages/core/schematics/ng-generate/output-migration/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import {Rule} from '@angular-devkit/schematics';
1010
import {OutputMigration} from '../../migrations/output-migration/output-migration';
11-
import {runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
11+
import {MigrationStage, runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
1212

1313
interface Options {
1414
path: string;
@@ -28,8 +28,12 @@ export function migrate(options: Options): Rule {
2828
);
2929
},
3030
}),
31-
beforeProgramCreation: (tsconfigPath) => {
32-
context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
31+
beforeProgramCreation: (tsconfigPath, stage) => {
32+
if (stage === MigrationStage.Analysis) {
33+
context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
34+
} else {
35+
context.logger.info(`Running migration for: ${tsconfigPath}...`);
36+
}
3337
},
3438
afterProgramCreation: (info, fs) => {
3539
const analysisPath = fs.resolve(options.analysisDir);

packages/core/schematics/ng-generate/self-closing-tags-migration/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import {Rule} from '@angular-devkit/schematics';
1010
import {SelfClosingTagsMigration} from '../../migrations/self-closing-tags-migration/self-closing-tags-migration';
11-
import {runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
11+
import {MigrationStage, runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
1212

1313
interface Options {
1414
path: string;
@@ -28,8 +28,12 @@ export function migrate(options: Options): Rule {
2828
);
2929
},
3030
}),
31-
beforeProgramCreation: (tsconfigPath) => {
32-
context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
31+
beforeProgramCreation: (tsconfigPath, stage) => {
32+
if (stage === MigrationStage.Analysis) {
33+
context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
34+
} else {
35+
context.logger.info(`Running migration for: ${tsconfigPath}...`);
36+
}
3337
},
3438
beforeUnitAnalysis: (tsconfigPath) => {
3539
context.logger.info(`Scanning for component tags: ${tsconfigPath}...`);

packages/core/schematics/ng-generate/signal-input-migration/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import {Rule} from '@angular-devkit/schematics';
1010
import {SignalInputMigration} from '../../migrations/signal-migration/src';
11-
import {runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
11+
import {MigrationStage, runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
1212

1313
interface Options {
1414
path: string;
@@ -32,8 +32,12 @@ export function migrate(options: Options): Rule {
3232
);
3333
},
3434
}),
35-
beforeProgramCreation: (tsconfigPath) => {
36-
context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
35+
beforeProgramCreation: (tsconfigPath, stage) => {
36+
if (stage === MigrationStage.Analysis) {
37+
context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
38+
} else {
39+
context.logger.info(`Running migration for: ${tsconfigPath}...`);
40+
}
3741
},
3842
afterProgramCreation: (info, fs) => {
3943
const analysisPath = fs.resolve(options.analysisDir);

packages/core/schematics/ng-generate/signal-queries-migration/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import {Rule} from '@angular-devkit/schematics';
1010
import {SignalQueriesMigration} from '../../migrations/signal-queries-migration/migration';
11-
import {runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
11+
import {MigrationStage, runMigrationInDevkit} from '../../utils/tsurge/helpers/angular_devkit';
1212

1313
interface Options {
1414
path: string;
@@ -32,8 +32,12 @@ export function migrate(options: Options): Rule {
3232
);
3333
},
3434
}),
35-
beforeProgramCreation: (tsconfigPath) => {
36-
context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
35+
beforeProgramCreation: (tsconfigPath, stage) => {
36+
if (stage === MigrationStage.Analysis) {
37+
context.logger.info(`Preparing analysis for: ${tsconfigPath}...`);
38+
} else {
39+
context.logger.info(`Running migration for: ${tsconfigPath}...`);
40+
}
3741
},
3842
afterProgramCreation: (info, fs) => {
3943
const analysisPath = fs.resolve(options.analysisDir);

packages/core/schematics/utils/tsurge/helpers/angular_devkit/run_in_devkit.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ import {ProjectRootRelativePath} from '../../project_paths';
1818
import {ProgramInfo} from '../../program_info';
1919
import {getProjectTsConfigPaths} from '../../../../utils/project_tsconfig_paths';
2020

21+
export enum MigrationStage {
22+
/** The migration is analyzing an entrypoint */
23+
Analysis,
24+
25+
/** The migration is about to migrate an entrypoint */
26+
Migrate,
27+
}
28+
2129
/** Information necessary to run a Tsurge migration in the devkit. */
2230
export interface TsurgeDevkitMigration {
2331
/** Instantiates the migration. */
@@ -27,13 +35,13 @@ export interface TsurgeDevkitMigration {
2735
tree: Tree;
2836

2937
/** Called before a program is created. Useful to notify the user before processing starts. */
30-
beforeProgramCreation?: (tsconfigPath: string) => void;
38+
beforeProgramCreation?: (tsconfigPath: string, stage: MigrationStage) => void;
3139

3240
/**
3341
* Called after a program is created. Useful when the
3442
* structure needs to be modified (e.g. filtering files).
3543
*/
36-
afterProgramCreation?: (info: ProgramInfo, fileSystem: FileSystem) => void;
44+
afterProgramCreation?: (info: ProgramInfo, fileSystem: FileSystem, stage: MigrationStage) => void;
3745

3846
/** Called before a unit is analyzed. Useful for logging. */
3947
beforeUnitAnalysis?: (tsconfigPath: string) => void;
@@ -55,21 +63,21 @@ export async function runMigrationInDevkit(config: TsurgeDevkitMigration): Promi
5563
if (!buildPaths.length && !testPaths.length) {
5664
throw new SchematicsException('Could not find any tsconfig file. Cannot run the migration.');
5765
}
66+
const tsconfigPaths = [...buildPaths, ...testPaths];
5867

5968
const fs = new DevkitMigrationFilesystem(config.tree);
6069
setFileSystem(fs);
6170

6271
const migration = config.getMigration(fs);
6372
const unitResults: unknown[] = [];
64-
const programInfos = [...buildPaths, ...testPaths].map((tsconfigPath) => {
65-
config.beforeProgramCreation?.(tsconfigPath);
73+
74+
const isFunnelMigration = migration instanceof TsurgeFunnelMigration;
75+
for (const tsconfigPath of tsconfigPaths) {
76+
config.beforeProgramCreation?.(tsconfigPath, MigrationStage.Analysis);
6677
const baseInfo = migration.createProgram(tsconfigPath, fs);
6778
const info = migration.prepareProgram(baseInfo);
68-
config.afterProgramCreation?.(info, fs);
69-
return {info, tsconfigPath};
70-
});
79+
config.afterProgramCreation?.(info, fs, MigrationStage.Analysis);
7180

72-
for (const {info, tsconfigPath} of programInfos) {
7381
config.beforeUnitAnalysis?.(tsconfigPath);
7482
unitResults.push(await migration.analyze(info));
7583
}
@@ -85,12 +93,17 @@ export async function runMigrationInDevkit(config: TsurgeDevkitMigration): Promi
8593
const globalMeta = await migration.globalMeta(combined);
8694
let replacements: Replacement[];
8795

88-
if (migration instanceof TsurgeFunnelMigration) {
96+
if (isFunnelMigration) {
8997
replacements = (await migration.migrate(globalMeta)).replacements;
9098
} else {
9199
replacements = [];
92100

93-
for (const {info} of programInfos) {
101+
for (const tsconfigPath of tsconfigPaths) {
102+
config.beforeProgramCreation?.(tsconfigPath, MigrationStage.Migrate);
103+
const baseInfo = migration.createProgram(tsconfigPath, fs);
104+
const info = migration.prepareProgram(baseInfo);
105+
config.afterProgramCreation?.(info, fs, MigrationStage.Migrate);
106+
94107
const result = await migration.migrate(globalMeta, info);
95108
replacements.push(...result.replacements);
96109
}

0 commit comments

Comments
 (0)








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: https://github.com/angular/angular/commit/9241615ad0825156f4bf31bc4308372e4789e902

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy