Skip to content

Commit

Permalink
feat(core): log a note after an interactive migration run with skippe…
Browse files Browse the repository at this point in the history
…d package updates (#16802)
  • Loading branch information
leosvelperez authored May 15, 2023
1 parent ee269b9 commit 6ebfbbe
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 10 deletions.
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

1 comment on commit 6ebfbbe

@vercel
Copy link

@vercel vercel bot commented on 6ebfbbe May 15, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

nx-dev – ./

nx-five.vercel.app
nx-dev-git-master-nrwl.vercel.app
nx-dev-nrwl.vercel.app
nx.dev

Please sign in to comment.