chore(repo): dogfood nx release commands (#19237)
This commit is contained in:
parent
d1310e3c39
commit
6327fab2e0
2
.gitignore
vendored
2
.gitignore
vendored
@ -24,7 +24,7 @@ jest.debug.config.js
|
|||||||
# Issues scraper creates these files, stored by github's cache
|
# Issues scraper creates these files, stored by github's cache
|
||||||
/scripts/issues-scraper/cached
|
/scripts/issues-scraper/cached
|
||||||
|
|
||||||
# Lerna creates this
|
# We don't commit a CHANELGELOG.md file to the repo, we only create Github releases
|
||||||
CHANGELOG.md
|
CHANGELOG.md
|
||||||
|
|
||||||
# Next.js
|
# Next.js
|
||||||
|
|||||||
@ -112,9 +112,7 @@ Yarn Berry operates slightly differently than Yarn Classic. In order to publish
|
|||||||
- localhost
|
- localhost
|
||||||
```
|
```
|
||||||
|
|
||||||
- Run `pnpm nx-release --local` in Terminal 2 to publish next minor version. If this version already exists, you can
|
- Run `pnpm nx-release minor --local` in Terminal 2 to publish next minor version. The output will report the version of published packages.
|
||||||
bump the minor version in `lerna.json` to toggle the next minor. The output will report the version of published
|
|
||||||
packages.
|
|
||||||
- Go to your target folder (e.g. `cd ./tmp`) in Terminal 2
|
- Go to your target folder (e.g. `cd ./tmp`) in Terminal 2
|
||||||
- Run `yarn dlx create-nx-workspace@123.4.5` in Terminal 2 (replace `123.4.5` with the version that got published).
|
- Run `yarn dlx create-nx-workspace@123.4.5` in Terminal 2 (replace `123.4.5` with the version that got published).
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,8 @@ import { existsSync, removeSync } from 'fs-extra';
|
|||||||
import { Config } from '@jest/types';
|
import { Config } from '@jest/types';
|
||||||
import * as isCI from 'is-ci';
|
import * as isCI from 'is-ci';
|
||||||
|
|
||||||
|
const LARGE_BUFFER = 1024 * 1000000;
|
||||||
|
|
||||||
export default async function (globalConfig: Config.ConfigGlobals) {
|
export default async function (globalConfig: Config.ConfigGlobals) {
|
||||||
const isVerbose: boolean =
|
const isVerbose: boolean =
|
||||||
process.env.NX_VERBOSE_LOGGING === 'true' || !!globalConfig.verbose;
|
process.env.NX_VERBOSE_LOGGING === 'true' || !!globalConfig.verbose;
|
||||||
@ -33,6 +35,7 @@ export default async function (globalConfig: Config.ConfigGlobals) {
|
|||||||
await new Promise<void>((res, rej) => {
|
await new Promise<void>((res, rej) => {
|
||||||
const publishProcess = exec(`pnpm nx-release --local ${publishVersion}`, {
|
const publishProcess = exec(`pnpm nx-release --local ${publishVersion}`, {
|
||||||
env: process.env,
|
env: process.env,
|
||||||
|
maxBuffer: LARGE_BUFFER,
|
||||||
});
|
});
|
||||||
let logs = Buffer.from('');
|
let logs = Buffer.from('');
|
||||||
if (isVerbose) {
|
if (isVerbose) {
|
||||||
|
|||||||
10
lerna.json
10
lerna.json
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"packages": ["build/packages/*", "build/packages/nx/native-packages/*"],
|
|
||||||
"version": "16.9.0-beta.3",
|
|
||||||
"granularPathspec": false,
|
|
||||||
"command": {
|
|
||||||
"publish": {
|
|
||||||
"graphType": "all"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
18
nx.json
18
nx.json
@ -56,7 +56,25 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"release": {
|
||||||
|
"groups": {
|
||||||
|
"npm": {
|
||||||
|
"projects": ["packages/*", "packages-legacy/*"],
|
||||||
|
"version": {
|
||||||
|
"generatorOptions": {
|
||||||
|
"packageRoot": "build/packages/{projectName}",
|
||||||
|
"currentVersionResolver": "registry"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"targetDefaults": {
|
"targetDefaults": {
|
||||||
|
"nx-release-publish": {
|
||||||
|
"options": {
|
||||||
|
"packageRoot": "build/packages/{projectName}"
|
||||||
|
}
|
||||||
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"dependsOn": ["build-base", "build-native"],
|
"dependsOn": ["build-base", "build-native"],
|
||||||
"inputs": [
|
"inputs": [
|
||||||
|
|||||||
@ -14,7 +14,6 @@
|
|||||||
"check-codeowners": "ts-node -P ./scripts/tsconfig.scripts.json ./scripts/check-codeowners.ts",
|
"check-codeowners": "ts-node -P ./scripts/tsconfig.scripts.json ./scripts/check-codeowners.ts",
|
||||||
"nx-release": "ts-node -P ./scripts/tsconfig.release.json ./scripts/nx-release",
|
"nx-release": "ts-node -P ./scripts/tsconfig.release.json ./scripts/nx-release",
|
||||||
"prepublishOnly": "node ./scripts/update-package-group.js",
|
"prepublishOnly": "node ./scripts/update-package-group.js",
|
||||||
"version": "pnpm prettier lerna.json --write",
|
|
||||||
"local-registry": "nx local-registry @nx/nx-source",
|
"local-registry": "nx local-registry @nx/nx-source",
|
||||||
"documentation": "ts-node -P scripts/tsconfig.scripts.json ./scripts/documentation/generators/main.ts && pnpm check-documentation-map",
|
"documentation": "ts-node -P scripts/tsconfig.scripts.json ./scripts/documentation/generators/main.ts && pnpm check-documentation-map",
|
||||||
"submit-plugin": "node ./scripts/submit-plugin.js",
|
"submit-plugin": "node ./scripts/submit-plugin.js",
|
||||||
@ -209,7 +208,6 @@
|
|||||||
"jsonc-eslint-parser": "^2.1.0",
|
"jsonc-eslint-parser": "^2.1.0",
|
||||||
"jsonc-parser": "3.2.0",
|
"jsonc-parser": "3.2.0",
|
||||||
"kill-port": "^1.6.1",
|
"kill-port": "^1.6.1",
|
||||||
"lerna": "6.6.2",
|
|
||||||
"less": "4.1.3",
|
"less": "4.1.3",
|
||||||
"less-loader": "11.1.0",
|
"less-loader": "11.1.0",
|
||||||
"license-webpack-plugin": "^4.0.2",
|
"license-webpack-plugin": "^4.0.2",
|
||||||
@ -371,10 +369,6 @@
|
|||||||
"check-codeowners",
|
"check-codeowners",
|
||||||
"documentation"
|
"documentation"
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"pnpm": {
|
|
||||||
"patchedDependencies": {
|
|
||||||
"lerna@6.6.2": "patches/lerna@6.6.2.patch"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1
packages/nx/native-packages/darwin-arm64/project.json
Normal file
1
packages/nx/native-packages/darwin-arm64/project.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
packages/nx/native-packages/darwin-x64/project.json
Normal file
1
packages/nx/native-packages/darwin-x64/project.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
packages/nx/native-packages/freebsd-x64/project.json
Normal file
1
packages/nx/native-packages/freebsd-x64/project.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
packages/nx/native-packages/linux-arm64-gnu/project.json
Normal file
1
packages/nx/native-packages/linux-arm64-gnu/project.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
packages/nx/native-packages/linux-x64-gnu/project.json
Normal file
1
packages/nx/native-packages/linux-x64-gnu/project.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
packages/nx/native-packages/linux-x64-musl/project.json
Normal file
1
packages/nx/native-packages/linux-x64-musl/project.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
packages/nx/native-packages/win32-x64-msvc/project.json
Normal file
1
packages/nx/native-packages/win32-x64-msvc/project.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@ -19,8 +19,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"copy-native-package-directories": {
|
||||||
|
"command": "cp -R build/packages/nx/native-packages/* build/packages"
|
||||||
|
},
|
||||||
"artifacts": {
|
"artifacts": {
|
||||||
"command": "pnpm napi artifacts -c build/packages/nx/package.json -d ./artifacts --dist build/packages/nx/native-packages"
|
"dependsOn": ["copy-native-package-directories"],
|
||||||
|
"command": "pnpm napi artifacts -c build/packages/nx/package.json -d ./artifacts --dist build/packages"
|
||||||
},
|
},
|
||||||
"build-base": {
|
"build-base": {
|
||||||
"executor": "@nx/js:tsc",
|
"executor": "@nx/js:tsc",
|
||||||
|
|||||||
@ -1,48 +0,0 @@
|
|||||||
diff --git a/dist/cli.js b/dist/cli.js
|
|
||||||
index 8cd49ff1e99dca8241a75bc412c669a85475fce2..8f081b7ee0769a493b11f22c5d5d0752e8285629 100755
|
|
||||||
--- a/dist/cli.js
|
|
||||||
+++ b/dist/cli.js
|
|
||||||
@@ -7933,7 +7933,10 @@ var require_src10 = __commonJS({
|
|
||||||
logPacked(pkg.packed);
|
|
||||||
return pkg;
|
|
||||||
}).catch((err) => {
|
|
||||||
- if (err.code === "EPUBLISHCONFLICT") {
|
|
||||||
+ if (
|
|
||||||
+ err.code === "EPUBLISHCONFLICT" ||
|
|
||||||
+ (err.code === "E403" &&
|
|
||||||
+ err.body?.error?.includes("You cannot publish over the previously published versions"))) {
|
|
||||||
tracker.warn("publish", `Package is already published: ${pkg.name}@${pkg.version}`);
|
|
||||||
tracker.completeWork(1);
|
|
||||||
return pkg;
|
|
||||||
diff --git a/dist/commands/publish/index.js b/dist/commands/publish/index.js
|
|
||||||
index 34fe8f496af5e7adaf58a7f9c4c3a11d812608c3..bbab4d70c044729b174208b2f1250f54ab69e56d 100644
|
|
||||||
--- a/dist/commands/publish/index.js
|
|
||||||
+++ b/dist/commands/publish/index.js
|
|
||||||
@@ -6094,7 +6094,10 @@ var require_src2 = __commonJS({
|
|
||||||
logPacked(pkg.packed);
|
|
||||||
return pkg;
|
|
||||||
}).catch((err) => {
|
|
||||||
- if (err.code === "EPUBLISHCONFLICT") {
|
|
||||||
+ if (
|
|
||||||
+ err.code === "EPUBLISHCONFLICT" ||
|
|
||||||
+ (err.code === "E403" &&
|
|
||||||
+ err.body?.error?.includes("You cannot publish over the previously published versions"))) {
|
|
||||||
tracker.warn("publish", `Package is already published: ${pkg.name}@${pkg.version}`);
|
|
||||||
tracker.completeWork(1);
|
|
||||||
return pkg;
|
|
||||||
diff --git a/dist/index.js b/dist/index.js
|
|
||||||
index a1f83a569598efc7f129d8de7d004f45177514f4..86364db7a267c0fa3eaafc9b1bc51838a41f4f4f 100644
|
|
||||||
--- a/dist/index.js
|
|
||||||
+++ b/dist/index.js
|
|
||||||
@@ -7932,7 +7932,10 @@ var require_src10 = __commonJS({
|
|
||||||
logPacked(pkg2.packed);
|
|
||||||
return pkg2;
|
|
||||||
}).catch((err) => {
|
|
||||||
- if (err.code === "EPUBLISHCONFLICT") {
|
|
||||||
+ if (
|
|
||||||
+ err.code === "EPUBLISHCONFLICT" ||
|
|
||||||
+ (err.code === "E403" &&
|
|
||||||
+ err.body?.error?.includes("You cannot publish over the previously published versions"))) {
|
|
||||||
tracker.warn("publish", `Package is already published: ${pkg2.name}@${pkg2.version}`);
|
|
||||||
tracker.completeWork(1);
|
|
||||||
return pkg2;
|
|
||||||
1253
pnpm-lock.yaml
generated
1253
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -1,29 +1,19 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
import * as yargs from 'yargs';
|
import { createProjectGraphAsync, workspaceRoot } from '@nx/devkit';
|
||||||
import { execSync } from 'child_process';
|
import { execSync } from 'node:child_process';
|
||||||
import { existsSync, readFileSync, rmSync, writeFileSync } from 'fs';
|
import { rmSync, writeFileSync } from 'node:fs';
|
||||||
|
import { join } from 'node:path';
|
||||||
import { URL } from 'node:url';
|
import { URL } from 'node:url';
|
||||||
import { join } from 'path';
|
import { isRelativeVersionKeyword } from 'nx/src/command-line/release/utils/semver';
|
||||||
|
import { ReleaseType, parse } from 'semver';
|
||||||
|
import * as yargs from 'yargs';
|
||||||
|
|
||||||
import { parse } from 'semver';
|
const LARGE_BUFFER = 1024 * 1000000;
|
||||||
|
|
||||||
const version = require('lerna/commands/version');
|
|
||||||
const publish = require('lerna/commands/publish');
|
|
||||||
|
|
||||||
const lernaJsonPath = join(__dirname, '../lerna.json');
|
|
||||||
const originalLernaJson = readFileSync(lernaJsonPath);
|
|
||||||
|
|
||||||
function hideFromGitIndex(uncommittedFiles: string[]) {
|
|
||||||
execSync(`git update-index --assume-unchanged ${uncommittedFiles.join(' ')}`);
|
|
||||||
|
|
||||||
return () =>
|
|
||||||
execSync(
|
|
||||||
`git update-index --no-assume-unchanged ${uncommittedFiles.join(' ')}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
const options = parseArgs();
|
const options = parseArgs();
|
||||||
|
// Perform minimal logging by default
|
||||||
|
let isVerboseLogging = process.env.NX_VERBOSE_LOGGING === 'true';
|
||||||
|
|
||||||
if (options.clearLocalRegistry) {
|
if (options.clearLocalRegistry) {
|
||||||
rmSync(join(__dirname, '../build/local-registry/storage'), {
|
rmSync(join(__dirname, '../build/local-registry/storage'), {
|
||||||
@ -32,123 +22,135 @@ function hideFromGitIndex(uncommittedFiles: string[]) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentLatestVersion = execSync('npm view nx version')
|
|
||||||
.toString()
|
|
||||||
.trim();
|
|
||||||
|
|
||||||
const parsedVersion = parse(options.version);
|
|
||||||
const parsedCurrentLatestVersion = parse(currentLatestVersion);
|
|
||||||
|
|
||||||
const distTag =
|
|
||||||
parsedVersion?.prerelease.length > 0
|
|
||||||
? 'next'
|
|
||||||
: parsedVersion?.major < parsedCurrentLatestVersion.major
|
|
||||||
? 'previous'
|
|
||||||
: 'latest';
|
|
||||||
|
|
||||||
const buildCommand = 'pnpm build';
|
const buildCommand = 'pnpm build';
|
||||||
console.log(`> ${buildCommand}`);
|
console.log(`> ${buildCommand}`);
|
||||||
execSync(buildCommand, {
|
execSync(buildCommand, {
|
||||||
stdio: [0, 1, 2],
|
stdio: [0, 1, 2],
|
||||||
|
maxBuffer: LARGE_BUFFER,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (options.local) {
|
// Ensure all the native-packages directories are available at the top level of the build directory, enabling consistent packageRoot structure
|
||||||
updateLernaJsonVersion(currentLatestVersion);
|
execSync(`pnpm nx copy-native-package-directories nx`, {
|
||||||
}
|
stdio: isVerboseLogging ? [0, 1, 2] : 'ignore',
|
||||||
|
maxBuffer: LARGE_BUFFER,
|
||||||
if (options.local) {
|
});
|
||||||
// Force all projects to be not private
|
|
||||||
const projects = JSON.parse(
|
|
||||||
execSync('npx lerna list --json --all').toString()
|
|
||||||
);
|
|
||||||
for (const proj of projects) {
|
|
||||||
if (proj.private) {
|
|
||||||
console.log('Publishing private package locally:', proj.name);
|
|
||||||
const packageJsonPath = join(proj.location, 'package.json');
|
|
||||||
const original = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
||||||
writeFileSync(
|
|
||||||
packageJsonPath,
|
|
||||||
JSON.stringify({ ...original, private: false })
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Expected to run as part of the Github `publish` workflow
|
||||||
if (!options.local && process.env.NPM_TOKEN) {
|
if (!options.local && process.env.NPM_TOKEN) {
|
||||||
// Delete all .node files that were built during the previous steps
|
// Delete all .node files that were built during the previous steps
|
||||||
// Always run before the artifacts step because we still need the .node files for native-packages
|
// Always run before the artifacts step because we still need the .node files for native-packages
|
||||||
execSync('find ./build -name "*.node" -delete', {
|
execSync('find ./build -name "*.node" -delete', {
|
||||||
stdio: [0, 1, 2],
|
stdio: [0, 1, 2],
|
||||||
|
maxBuffer: LARGE_BUFFER,
|
||||||
});
|
});
|
||||||
|
|
||||||
execSync('npx nx run-many --target=artifacts', {
|
execSync('pnpm nx run-many --target=artifacts', {
|
||||||
stdio: [0, 1, 2],
|
stdio: [0, 1, 2],
|
||||||
|
maxBuffer: LARGE_BUFFER,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const versionOptions = {
|
const runNxReleaseVersion = () => {
|
||||||
bump: options.version ? options.version : undefined,
|
let versionCommand = `pnpm nx release version${
|
||||||
conventionalCommits: true,
|
options.version ? ` --specifier ${options.version}` : ''
|
||||||
conventionalPrerelease: options.tag === 'next',
|
}`;
|
||||||
preid: options.preid,
|
if (options.dryRun) {
|
||||||
forcePublish: true,
|
versionCommand += ' --dry-run';
|
||||||
createRelease: 'github',
|
}
|
||||||
tagVersionPrefix: '',
|
console.log(`> ${versionCommand}`);
|
||||||
exact: true,
|
execSync(versionCommand, {
|
||||||
gitRemote: options.gitRemote,
|
stdio: isVerboseLogging ? [0, 1, 2] : 'ignore',
|
||||||
gitTagVersion: !process.env.NPM_TOKEN,
|
maxBuffer: LARGE_BUFFER,
|
||||||
message: 'chore(misc): publish %v',
|
});
|
||||||
loglevel: options.loglevel ?? 'info',
|
|
||||||
yes: !!process.env.NPM_TOKEN,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (options.local) {
|
|
||||||
versionOptions.conventionalCommits = false;
|
|
||||||
delete versionOptions.createRelease;
|
|
||||||
versionOptions.gitTagVersion = false;
|
|
||||||
versionOptions.loglevel = options.loglevel ?? 'error';
|
|
||||||
versionOptions.yes = true;
|
|
||||||
versionOptions.bump = options.version ? options.version : 'minor';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.local) {
|
|
||||||
/**
|
|
||||||
* Hide changes from Lerna
|
|
||||||
*/
|
|
||||||
const uncommittedFiles = execSync('git diff --name-only --relative HEAD .')
|
|
||||||
.toString()
|
|
||||||
.split('\n')
|
|
||||||
.filter((i) => i.length > 0)
|
|
||||||
.filter((f) => existsSync(f));
|
|
||||||
const unhideFromGitIndex = hideFromGitIndex(uncommittedFiles);
|
|
||||||
|
|
||||||
process.on('exit', unhideFromGitIndex);
|
|
||||||
process.on('SIGTERM', unhideFromGitIndex);
|
|
||||||
process.on('SIGINT', unhideFromGitIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
const publishOptions: Record<string, boolean | string | undefined> = {
|
|
||||||
gitReset: false,
|
|
||||||
distTag: distTag,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Intended for creating a github release which triggers the publishing workflow
|
||||||
if (!options.local && !process.env.NPM_TOKEN) {
|
if (!options.local && !process.env.NPM_TOKEN) {
|
||||||
|
// For this important use-case it makes sense to always have full logs
|
||||||
|
isVerboseLogging = true;
|
||||||
|
|
||||||
execSync('git status --ahead-behind');
|
execSync('git status --ahead-behind');
|
||||||
|
|
||||||
await version(versionOptions);
|
if (isRelativeVersionKeyword(options.version)) {
|
||||||
|
throw new Error(
|
||||||
|
'When creating actual releases, you must use an exact semver version'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
runNxReleaseVersion();
|
||||||
|
|
||||||
|
let changelogCommand = `pnpm nx release changelog ${options.version} --tagVersionPrefix="" --interactive`;
|
||||||
|
if (options.from) {
|
||||||
|
changelogCommand += ` --from ${options.from}`;
|
||||||
|
}
|
||||||
|
if (options.gitRemote) {
|
||||||
|
changelogCommand += ` --git-remote ${options.gitRemote}`;
|
||||||
|
}
|
||||||
|
if (options.dryRun) {
|
||||||
|
changelogCommand += ' --dry-run';
|
||||||
|
}
|
||||||
|
console.log(`> ${changelogCommand}`);
|
||||||
|
execSync(changelogCommand, {
|
||||||
|
stdio: isVerboseLogging ? [0, 1, 2] : 'ignore',
|
||||||
|
maxBuffer: LARGE_BUFFER,
|
||||||
|
});
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
'Check github: https://github.com/nrwl/nx/actions/workflows/publish.yml'
|
'Check github: https://github.com/nrwl/nx/actions/workflows/publish.yml'
|
||||||
);
|
);
|
||||||
} else if (!options.skipPublish) {
|
process.exit(0);
|
||||||
await publish({ ...versionOptions, ...publishOptions });
|
|
||||||
} else {
|
|
||||||
await version(versionOptions);
|
|
||||||
console.warn('Not Publishing because --dryRun was passed');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.local) {
|
runNxReleaseVersion();
|
||||||
restoreOriginalLernaJson();
|
|
||||||
|
if (options.dryRun) {
|
||||||
|
console.warn('Not Publishing because --dryRun was passed');
|
||||||
|
} else {
|
||||||
|
// If publishing locally, force all projects to not be private first
|
||||||
|
if (options.local) {
|
||||||
|
console.log(
|
||||||
|
'\nPublishing locally, so setting all resolved packages to not be private'
|
||||||
|
);
|
||||||
|
const projectGraph = await createProjectGraphAsync();
|
||||||
|
for (const proj of Object.values(projectGraph.nodes)) {
|
||||||
|
if (proj.data.targets?.['nx-release-publish']) {
|
||||||
|
const packageJsonPath = join(
|
||||||
|
workspaceRoot,
|
||||||
|
proj.data.targets?.['nx-release-publish']?.options.packageRoot,
|
||||||
|
'package.json'
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
const packageJson = require(packageJsonPath);
|
||||||
|
if (packageJson.private) {
|
||||||
|
console.log(
|
||||||
|
'- Publishing private package locally:',
|
||||||
|
packageJson.name
|
||||||
|
);
|
||||||
|
writeFileSync(
|
||||||
|
packageJsonPath,
|
||||||
|
JSON.stringify({ ...packageJson, private: false })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const distTag = determineDistTag(options.version);
|
||||||
|
|
||||||
|
// Run with dynamic output-style so that we have more minimal logs by default but still always see errors
|
||||||
|
let publishCommand = `pnpm nx release publish --registry=${getRegistry()} --tag=${distTag} --output-style=dynamic --parallel=8`;
|
||||||
|
if (options.dryRun) {
|
||||||
|
publishCommand += ' --dry-run';
|
||||||
|
}
|
||||||
|
console.log(`\n> ${publishCommand}`);
|
||||||
|
execSync(publishCommand, {
|
||||||
|
stdio: [0, 1, 2],
|
||||||
|
maxBuffer: LARGE_BUFFER,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
process.exit(0);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
function parseArgs() {
|
function parseArgs() {
|
||||||
@ -161,9 +163,9 @@ function parseArgs() {
|
|||||||
'$0 [version]',
|
'$0 [version]',
|
||||||
'This script is for publishing Nx both locally and publically'
|
'This script is for publishing Nx both locally and publically'
|
||||||
)
|
)
|
||||||
.option('skipPublish', {
|
.option('dryRun', {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
description: 'Skips the actual publishing for testing out versioning',
|
description: 'Dry-run flag to be passed to all `nx release` commands',
|
||||||
})
|
})
|
||||||
.option('clearLocalRegistry', {
|
.option('clearLocalRegistry', {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
@ -182,6 +184,11 @@ function parseArgs() {
|
|||||||
description: "Don't use this unless you really know what it does",
|
description: "Don't use this unless you really know what it does",
|
||||||
hidden: true,
|
hidden: true,
|
||||||
})
|
})
|
||||||
|
.option('from', {
|
||||||
|
type: 'string',
|
||||||
|
description:
|
||||||
|
'Git ref to pass to `nx release changelog`. Not applicable for local publishing or e2e tests.',
|
||||||
|
})
|
||||||
.positional('version', {
|
.positional('version', {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description:
|
description:
|
||||||
@ -193,11 +200,6 @@ function parseArgs() {
|
|||||||
'Alternate git remote name to publish tags to (useful for testing changelog)',
|
'Alternate git remote name to publish tags to (useful for testing changelog)',
|
||||||
default: 'origin',
|
default: 'origin',
|
||||||
})
|
})
|
||||||
.option('loglevel', {
|
|
||||||
type: 'string',
|
|
||||||
description: 'Log Level',
|
|
||||||
choices: ['error', 'info', 'debug'],
|
|
||||||
})
|
|
||||||
.example(
|
.example(
|
||||||
'$0',
|
'$0',
|
||||||
`By default, this will locally publish a minor version bump as latest. Great for local development. Most developers should only need this.`
|
`By default, this will locally publish a minor version bump as latest. Great for local development. Most developers should only need this.`
|
||||||
@ -222,6 +224,7 @@ function parseArgs() {
|
|||||||
['gitRemote', 'force'],
|
['gitRemote', 'force'],
|
||||||
'Real Publishing Options for actually publishing to NPM'
|
'Real Publishing Options for actually publishing to NPM'
|
||||||
)
|
)
|
||||||
|
.demandOption('version')
|
||||||
.check((args) => {
|
.check((args) => {
|
||||||
const registry = getRegistry();
|
const registry = getRegistry();
|
||||||
const registryIsLocalhost = registry.hostname === 'localhost';
|
const registryIsLocalhost = registry.hostname === 'localhost';
|
||||||
@ -244,23 +247,48 @@ function parseArgs() {
|
|||||||
})
|
})
|
||||||
.parseSync();
|
.parseSync();
|
||||||
|
|
||||||
parsedArgs.tag ??= parsedArgs.local ? 'latest' : 'next';
|
|
||||||
|
|
||||||
return parsedArgs;
|
return parsedArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateLernaJsonVersion(version: string) {
|
|
||||||
const json = JSON.parse(readFileSync(lernaJsonPath).toString());
|
|
||||||
|
|
||||||
json.version = version;
|
|
||||||
|
|
||||||
writeFileSync(lernaJsonPath, JSON.stringify(json));
|
|
||||||
}
|
|
||||||
|
|
||||||
function restoreOriginalLernaJson() {
|
|
||||||
writeFileSync(lernaJsonPath, originalLernaJson);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRegistry() {
|
function getRegistry() {
|
||||||
return new URL(execSync('npm config get registry').toString().trim());
|
return new URL(execSync('npm config get registry').toString().trim());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function determineDistTag(newVersion: string): 'latest' | 'next' | 'previous' {
|
||||||
|
// For a relative version keyword, it cannot be previous
|
||||||
|
if (isRelativeVersionKeyword(newVersion)) {
|
||||||
|
const prereleaseKeywords: ReleaseType[] = [
|
||||||
|
'premajor',
|
||||||
|
'preminor',
|
||||||
|
'prepatch',
|
||||||
|
'prerelease',
|
||||||
|
];
|
||||||
|
return prereleaseKeywords.includes(newVersion) ? 'next' : 'latest';
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsedGivenVersion = parse(newVersion);
|
||||||
|
if (!parsedGivenVersion) {
|
||||||
|
throw new Error(
|
||||||
|
`Unable to parse the given version: "${newVersion}". Is it valid semver?`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentLatestVersion = execSync('npm view nx version')
|
||||||
|
.toString()
|
||||||
|
.trim();
|
||||||
|
const parsedCurrentLatestVersion = parse(currentLatestVersion);
|
||||||
|
if (!parsedCurrentLatestVersion) {
|
||||||
|
throw new Error(
|
||||||
|
`The current version resolved from the npm registry could not be parsed (resolved "${currentLatestVersion}")`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const distTag =
|
||||||
|
parsedGivenVersion.prerelease.length > 0
|
||||||
|
? 'next'
|
||||||
|
: parsedGivenVersion.major < parsedCurrentLatestVersion.major
|
||||||
|
? 'previous'
|
||||||
|
: 'latest';
|
||||||
|
|
||||||
|
return distTag;
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user