Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core): log a note after an interactive migration run with skipped package updates #16802

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/shared/core-features/automate-updating-dependencies.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,16 @@ Updating happens in three steps:
First, run the `migrate` command:

```shell
nx migrate latest # same as nx migrate @nx/workspace@latest
nx migrate latest # same as nx migrate nx@latest
```

You can also specify the name of the package and the version:

```shell
nx migrate @nx/workspace@version # you can also specify version
nx migrate nx@version # you can also specify version
```

This fetches the specified version of the `@nx/workspace` package, analyzes the dependencies and fetches all the dependent packages. The process keeps going until all the dependencies are resolved. This results in:
This fetches the specified version of the `nx` package, analyzes the dependencies and fetches all the dependent packages. The process keeps going until all the dependencies are resolved. This results in:

- The `package.json` being updated
- A `migrations.json` being generated if there are pending migrations.
Expand Down
33 changes: 32 additions & 1 deletion docs/shared/recipes/advanced-update.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,37 @@
# Advanced update process

This is an advanced version of the [standard update process](/core-features/automate-updating-dependencies).
This guide describes advanced scenarios when it comes to updating Nx and the workspaces dependencies. It starts with a summary of the [standard update process](/core-features/automate-updating-dependencies) and continues with those advanced use cases.

## Updating to the latest Nx version

The following steps are a summary of the [standard update process](/core-features/automate-updating-dependencies). For more information on each step, please visit that page.

### Step 1: Updating dependencies and generating migrations

First, run the `migrate` command:

```shell
nx migrate latest # same as nx migrate nx@latest
```

This performs the following changes:

- Updates the versions of the relevant packages in the `package.json` file.
- Generates a `migrations.json` if there are pending migrations.

### Step 2: Running migrations

The next step in the process involves using the `migrate` command to apply the migrations that were generated in the `migrations.json` file in the previous step. You can do so by running:

```shell
nx migrate --run-migrations
```

All changes to your source code will be unstaged and ready for you to review and commit yourself.

### Step 3: Cleaning up

After you run all the migrations, you can remove `migrations.json` and commit any outstanding changes.

## Managing migration steps

Expand Down
10 changes: 10 additions & 0 deletions packages/nx/src/command-line/migrate/migrate.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,7 @@ describe('Migration', () => {
},
'@my-company/lib-4': { version: '2.0.1', addToPackageJson: false },
},
minVersionWithSkippedUpdates: undefined,
});
});

Expand Down Expand Up @@ -503,6 +504,7 @@ describe('Migration', () => {
'@my-company/lib-1': { version: '3.0.0', addToPackageJson: false },
'@my-company/lib-2': { version: '3.0.0', addToPackageJson: false },
},
minVersionWithSkippedUpdates: undefined,
});
});

Expand Down Expand Up @@ -635,6 +637,7 @@ describe('Migration', () => {
child2: { version: '3.0.0', addToPackageJson: false },
child3: { version: '3.0.0', addToPackageJson: false },
},
minVersionWithSkippedUpdates: undefined,
});
expect(enquirer.prompt).toHaveBeenCalledWith(
expect.arrayContaining([
Expand Down Expand Up @@ -693,6 +696,7 @@ describe('Migration', () => {
mypackage: { version: '2.0.0', addToPackageJson: false },
child1: { version: '3.0.0', addToPackageJson: false },
},
minVersionWithSkippedUpdates: '2.0.0',
});
expect(enquirer.prompt).toHaveBeenCalled();
});
Expand Down Expand Up @@ -749,6 +753,7 @@ describe('Migration', () => {
child2: { version: '3.0.0', addToPackageJson: false },
child3: { version: '3.0.0', addToPackageJson: false },
},
minVersionWithSkippedUpdates: undefined,
});
expect(enquirer.prompt).not.toHaveBeenCalled();
});
Expand Down Expand Up @@ -831,6 +836,7 @@ describe('Migration', () => {
child2: { version: '3.0.0', addToPackageJson: false },
child3: { version: '3.0.0', addToPackageJson: false },
},
minVersionWithSkippedUpdates: undefined,
});
});

Expand Down Expand Up @@ -913,6 +919,7 @@ describe('Migration', () => {
pkg1: { version: '2.0.0', addToPackageJson: false },
pkg2: { version: '2.0.0', addToPackageJson: false },
},
minVersionWithSkippedUpdates: undefined,
});
});

Expand Down Expand Up @@ -961,6 +968,7 @@ describe('Migration', () => {
mypackage: { version: '2.0.0', addToPackageJson: false },
child1: { version: '3.0.0', addToPackageJson: false },
},
minVersionWithSkippedUpdates: undefined,
});
expect(enquirer.prompt).toHaveBeenCalledWith(
expect.arrayContaining([
Expand Down Expand Up @@ -1013,6 +1021,7 @@ describe('Migration', () => {
packageUpdates: {
mypackage: { version: '2.0.0', addToPackageJson: false },
},
minVersionWithSkippedUpdates: undefined,
});
expect(enquirer.prompt).not.toHaveBeenCalled();
});
Expand Down Expand Up @@ -1257,6 +1266,7 @@ describe('Migration', () => {
packageUpdates: {
parent: { version: '2.0.0', addToPackageJson: false },
},
minVersionWithSkippedUpdates: '2.0.0',
});
expect(enquirer.prompt).toHaveBeenCalled();
});
Expand Down
32 changes: 26 additions & 6 deletions packages/nx/src/command-line/migrate/migrate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ export class Migrator {
private readonly collectedVersions: Record<string, string> = {};
private readonly promptAnswers: Record<string, boolean> = {};
private readonly nxInstallation: NxJsonConfiguration['installation'] | null;
private minVersionWithSkippedUpdates: string | undefined;

constructor(opts: MigratorOptions) {
this.packageJson = opts.packageJson;
Expand All @@ -156,7 +157,11 @@ export class Migrator {
});

const migrations = await this.createMigrateJson();
return { packageUpdates: this.packageUpdates, migrations };
return {
packageUpdates: this.packageUpdates,
migrations,
minVersionWithSkippedUpdates: this.minVersionWithSkippedUpdates,
};
}

private async createMigrateJson() {
Expand Down Expand Up @@ -567,6 +572,15 @@ export class Migrator {
},
]).then(({ shouldApply }: { shouldApply: boolean }) => {
this.promptAnswers[promptKey] = shouldApply;

if (
!shouldApply &&
(!this.minVersionWithSkippedUpdates ||
lt(packageUpdate.version, this.minVersionWithSkippedUpdates))
) {
this.minVersionWithSkippedUpdates = packageUpdate.version;
}

return shouldApply;
});
}
Expand Down Expand Up @@ -1232,10 +1246,8 @@ async function generateMigrationsJsonAndUpdatePackageJson(
excludeAppliedMigrations: opts.excludeAppliedMigrations,
});

const { migrations, packageUpdates } = await migrator.migrate(
opts.targetPackage,
opts.targetVersion
);
const { migrations, packageUpdates, minVersionWithSkippedUpdates } =
await migrator.migrate(opts.targetPackage, opts.targetVersion);

updatePackageJson(root, packageUpdates);
await updateInstallationDetails(root, packageUpdates);
Expand Down Expand Up @@ -1264,7 +1276,15 @@ async function generateMigrationsJsonAndUpdatePackageJson(
...(migrations.length > 0
? [`- Run '${pmc.exec} nx migrate --run-migrations'`]
: []),
`- To learn more go to https://nx.dev/core-features/automate-updating-dependencies`,
...(opts.interactive && minVersionWithSkippedUpdates
? [
`- You opted out of some migrations for now. Write the following command down somewhere to apply these migrations later:`,
` nx migrate ${opts.targetVersion} --from ${opts.targetPackage}@${minVersionWithSkippedUpdates} --exclude-applied-migrations`,
`- To learn more go to https://nx.dev/recipes/other/advanced-update`,
]
: [
`- To learn more go to https://nx.dev/core-features/automate-updating-dependencies`,
]),
...(showConnectToCloudMessage()
? [
`- You may run '${pmc.run(
Expand Down