angular-cli icon indicating copy to clipboard operation
angular-cli copied to clipboard

List available migrations and let users choose on `ng update` (including optional migrations)

Open d-koppenhagen opened this issue 3 years ago • 4 comments

🚀 Feature request

Command (mark with an x)

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

Description

Currently executing ng update will perform necessary migrations from one angular version to another which works smoothly.

However there there are two issues I see:

  1. Users can't select / see the available migrations with their details before executing ng update
  2. Optional migrations that may be available won't be executed and listed. In fact users that doesn't know about such probably very helpful but optional migrations aren't able to find and execute them.

One example for this which can be found at update.angular.io only when selecting 'medium' or 'advanced' option:

ng update @angular/cli@12 --migrate-only production-by-default

Identifying and executing such optional migrations can be tricky if there isn't a way to list/select them.

Describe the solution you'd like

Ideally during the execution, ng update should list the migrations with their default execution state and also include all available optional migrations with a non-preselected state like this:

> ng update
Which migrations do you want to execute:
[x] migration1Name: migration1Description
[x] migration2Name: migration1Description
[ ] optionalMigration1Name: optionalMigration1Description

After a user made the selection, all selected migrations will be executed including the selected optional ones. This will cause a better developer experience as it's more clear what will happen during the update process before actually running the migrations.

It should be considered, that tools like renovate or dependabot can't handle such interactive selections. Therefore a flag could be helpful to deactivate the prompt and switch back to the current behavior (only executing the pre-selected non-optional migrations):

ng update --interactive=false

As users may have already executed migrations previously or want to know what migrations are available at another point of time, a separate migration command/option could be helpful:

> ng update --list-migrations
- migration1Name: migration1Description
- migration2Name: migration1Description
- optionalMigration1Name: optionalMigration1Description

To execute a migration run: ng update --migrate-only <migration-name>

Describe alternatives you've considered

An alternative would be to implement a "small" solution that would at least list possible optional migrations at the end of the ng update log to give users a hint about possibly further migration they can execute manually

> ng update

...

Further optional migrations are available:

- migration1Name: migration1Description
- migration2Name: migration1Description
- optionalMigration1Name: optionalMigration1Description

To execute a migration run: ng update --migrate-only <migration-name>

d-koppenhagen avatar May 24 '22 02:05 d-koppenhagen

I do agree that we should provide a better DX experience for optional migrations.

alan-agius4 avatar May 24 '22 06:05 alan-agius4

This feature request is now candidate for our backlog! In the next phase, the community has 60 days to upvote. If the request receives more than 20 upvotes, we'll move it to our consideration list.

You can find more details about the feature request process in our documentation.

angular-robot[bot] avatar May 24 '22 13:05 angular-robot[bot]

Currently an optional migration seems to be handled by simply setting a version in the migration that will not match with any realistic Angular Version. That will cause the migration isn't executed by default.

See: https://github.com/angular/angular-cli/blob/12.2.x/packages/schematics/angular/migrations/migration-collection.json#L128-L133

 "production-by-default": {
      "version": "9999.0.0",
      "factory": "./update-12/production-default-config",
      "description": "Optional migration to update Angular CLI workspace configurations to 'production' mode by default."
    }

I think it would be better to add an explicit flag like optional with the type of boolean. This would allow to define migrations for related versions but make them optionally executable.

d-koppenhagen avatar May 24 '22 17:05 d-koppenhagen

Just a heads up that we kicked off a community voting process for your feature request. There are 20 days until the voting process ends.

Find more details about Angular's feature request process in our documentation.

angular-robot[bot] avatar Jul 03 '22 13:07 angular-robot[bot]

This issue has been automatically locked due to inactivity. Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.