angular / angular/angular-cli

externalSchematic executes schematics from migration.json instead of collection.json

Open
#21,131 1 comment 0 reactions 0 assignees View on GitHub
area: @angular-devkit/schematics freq1: low severity3: broken type: bug/fix
Dominant language
TypeScript
Stars
27k
Forks
11.8k
Avg merge
14h 23m
Merged PRs (30d)
162

Description

# 🐞 Bug report

### Command

- [ ] new
- [ ] build
- [ ] serve
- [ ] test
- [ ] e2e
- [ ] generate
- [ ] add
- [x] update
- [ ] lint
- [ ] extract-i18n
- [ ] run
- [ ] config
- [ ] help
- [ ] version
- [ ] doc

### Is this a regression?

No

### Description

The function `externalSchematic` from `@angular-devkit/schematics` does not call the schematic from the `collection.json` but instead from the `migration.json` If the collection (package) name is the same as the current package that is migrated.

## 🔬 Minimal Reproduction

1. The package `ngx-my-lib` has the schematic `config` defined in the `collection.json`
2. Create a migration schematic for the package `ngx-my-lib`.
3. Call the externalSchematic function with `externalSchematic('ngx-my-lib', 'config')` in the migration schematic.
4. Execute the migration schematic

## 🔥 Exception or Error

Schematic "config" not found in collection "ngx-my-lib"

## 🌍 Your Environment



Angular CLI: 12.0.3
Node: 14.16.1
Package Manager: yarn 1.22.10
OS: linux x64

Angular: undefined
...

Package Version
------------------------------------------------------
@angular-devkit/architect 0.1200.3
@angular-devkit/core 12.0.3
@angular-devkit/schematics 12.0.3
@angular/cli 12.0.3
@schematics/angular 12.0.3
typescript 4.2.4

**Anything else relevant?**

I could track down this error to the `createCollection` method in the class `SchematicEngine`. Invoking the `externalSchematic` the `Collection` instance for the `migration.json` is cached with the key `ngx-my-lib`. So the external schematic execution does not load the collection for the `collection.json`, but for the `migration.json`.

Contributor guide

Open the contributing guide

Research direction

Start with SchematicEngine.createCollection and the externalSchematic call described in the report, then trace how collection.json and migration.json are loaded and cached under the same package name. Reproduce the ngx-my-lib scenario and verify that externalSchematic resolves the schematic from collection.json rather than migration.json.

Written by the indexing model from the issue text.

Assessment

Tech stack
angular, typescript
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.