@build-script/package-tools 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/command-file-map.generated.d.ts +2 -1
- package/lib/command-file-map.generated.d.ts.map +1 -1
- package/lib/command-file-map.generated.js +2 -1
- package/lib/command-file-map.generated.js.map +1 -1
- package/lib/commands/detect-package-change.d.ts.map +1 -1
- package/lib/commands/detect-package-change.js +3 -1
- package/lib/commands/detect-package-change.js.map +1 -1
- package/lib/commands/monorepo-bump-version.d.ts.map +1 -1
- package/lib/commands/monorepo-bump-version.js +13 -23
- package/lib/commands/monorepo-bump-version.js.map +1 -1
- package/lib/commands/monorepo-cnpm-sync.d.ts.map +1 -1
- package/lib/commands/monorepo-cnpm-sync.js +12 -2
- package/lib/commands/monorepo-cnpm-sync.js.map +1 -1
- package/lib/commands/monorepo-invalid.d.ts.map +1 -1
- package/lib/commands/monorepo-invalid.js +4 -2
- package/lib/commands/monorepo-invalid.js.map +1 -1
- package/lib/commands/monorepo-link-binaries.d.ts +22 -0
- package/lib/commands/monorepo-link-binaries.d.ts.map +1 -0
- package/lib/commands/monorepo-link-binaries.js +146 -0
- package/lib/commands/monorepo-link-binaries.js.map +1 -0
- package/lib/commands/monorepo-publish.d.ts.map +1 -1
- package/lib/commands/monorepo-publish.js +45 -36
- package/lib/commands/monorepo-publish.js.map +1 -1
- package/lib/commands/monorepo-tsconfig.d.ts.map +1 -1
- package/lib/commands/monorepo-tsconfig.js.map +1 -1
- package/lib/commands/monorepo-upgrade.d.ts.map +1 -1
- package/lib/commands/monorepo-upgrade.js +4 -2
- package/lib/commands/monorepo-upgrade.js.map +1 -1
- package/lib/commands/run-if-version-mismatch.d.ts.map +1 -1
- package/lib/commands/run-if-version-mismatch.js +6 -4
- package/lib/commands/run-if-version-mismatch.js.map +1 -1
- package/lib/commands/test.d.ts.map +1 -1
- package/lib/commands/test.js +3 -1
- package/lib/commands/test.js.map +1 -1
- package/lib/common/cache/native.npm.js +2 -2
- package/lib/common/cache/native.npm.js.map +1 -1
- package/lib/common/functions/cli.d.ts +4 -1
- package/lib/common/functions/cli.d.ts.map +1 -1
- package/lib/common/functions/cli.js +3 -3
- package/lib/common/functions/cli.js.map +1 -1
- package/lib/common/git/git.d.ts +1 -0
- package/lib/common/git/git.d.ts.map +1 -1
- package/lib/common/git/git.js +38 -0
- package/lib/common/git/git.js.map +1 -1
- package/lib/common/package-manager/driver.abstract.d.ts +3 -3
- package/lib/common/package-manager/driver.abstract.d.ts.map +1 -1
- package/lib/common/package-manager/driver.abstract.js +2 -4
- package/lib/common/package-manager/driver.abstract.js.map +1 -1
- package/lib/common/package-manager/driver.pnpm.d.ts.map +1 -1
- package/lib/common/package-manager/driver.pnpm.js +6 -3
- package/lib/common/package-manager/driver.pnpm.js.map +1 -1
- package/lib/common/package-manager/functions.d.ts.map +1 -1
- package/lib/common/package-manager/functions.js.map +1 -1
- package/lib/common/package-manager/package-manager.d.ts +2 -2
- package/lib/common/package-manager/package-manager.d.ts.map +1 -1
- package/lib/common/package-manager/package-manager.js +0 -3
- package/lib/common/package-manager/package-manager.js.map +1 -1
- package/lib/common/package-manager/proxy.js +1 -1
- package/lib/common/package-manager/proxy.js.map +1 -1
- package/lib/common/shared-jobs/clear-cache.d.ts +3 -0
- package/lib/common/shared-jobs/clear-cache.d.ts.map +1 -0
- package/lib/common/shared-jobs/clear-cache.js +14 -0
- package/lib/common/shared-jobs/clear-cache.js.map +1 -0
- package/lib/common/shared-jobs/cnpm-sync.d.ts +0 -2
- package/lib/common/shared-jobs/cnpm-sync.d.ts.map +1 -1
- package/lib/common/shared-jobs/cnpm-sync.js +1 -22
- package/lib/common/shared-jobs/cnpm-sync.js.map +1 -1
- package/lib/common/shared-jobs/detect-change-job.d.ts.map +1 -1
- package/lib/common/shared-jobs/detect-change-job.js +6 -0
- package/lib/common/shared-jobs/detect-change-job.js.map +1 -1
- package/lib/common/taball/decompress.d.ts.map +1 -1
- package/lib/common/taball/decompress.js +4 -1
- package/lib/common/taball/decompress.js.map +1 -1
- package/lib/common/taball/file-download.js +2 -7
- package/lib/common/taball/file-download.js.map +1 -1
- package/lib/common/temp-work-folder.d.ts +2 -2
- package/lib/common/temp-work-folder.d.ts.map +1 -1
- package/lib/common/temp-work-folder.js.map +1 -1
- package/lib/common/version.generated.d.ts +2 -2
- package/lib/common/version.generated.js +2 -2
- package/lib/main.js +1 -1
- package/lib/main.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -12
- package/src/command-file-map.generated.ts +2 -1
- package/src/command-file-map.generator.ts +2 -2
- package/src/commands/detect-package-change.ts +3 -1
- package/src/commands/monorepo-bump-version.ts +17 -28
- package/src/commands/monorepo-cnpm-sync.ts +14 -2
- package/src/commands/monorepo-invalid.ts +4 -2
- package/src/commands/monorepo-link-binaries.ts +168 -0
- package/src/commands/monorepo-publish.ts +58 -54
- package/src/commands/monorepo-tsconfig.ts +1 -2
- package/src/commands/monorepo-upgrade.ts +4 -3
- package/src/commands/run-if-version-mismatch.ts +7 -7
- package/src/commands/test.ts +3 -1
- package/src/common/cache/native.npm.ts +2 -2
- package/src/common/functions/cli.ts +6 -3
- package/src/common/git/git.ts +44 -6
- package/src/common/package-manager/driver.abstract.ts +4 -7
- package/src/common/package-manager/driver.pnpm.ts +8 -3
- package/src/common/package-manager/functions.ts +2 -12
- package/src/common/package-manager/package-manager.ts +3 -13
- package/src/common/package-manager/proxy.ts +1 -1
- package/src/common/shared-jobs/clear-cache.ts +14 -0
- package/src/common/shared-jobs/cnpm-sync.ts +1 -25
- package/src/common/shared-jobs/detect-change-job.ts +7 -0
- package/src/common/taball/decompress.ts +3 -1
- package/src/common/taball/file-download.ts +4 -15
- package/src/common/temp-work-folder.ts +2 -2
- package/src/common/version.generated.ts +2 -2
- package/src/common/version.generator.ts +1 -1
- package/src/main.ts +2 -14
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@build-script/package-tools",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.5",
|
|
5
5
|
"bin": {
|
|
6
6
|
"package-tools": "./load.js",
|
|
7
7
|
"njspkg": "./load.js"
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
"source-map-support": "^0.5.21",
|
|
22
22
|
"targz": "^1.0.1",
|
|
23
23
|
"tiny-async-pool": "^2.1.0",
|
|
24
|
-
"@build-script/monorepo-lib": "^0.0.
|
|
25
|
-
"@idlebox/
|
|
26
|
-
"@idlebox/
|
|
27
|
-
"@idlebox/
|
|
28
|
-
"@idlebox/logger": "^0.0.
|
|
29
|
-
"@idlebox/json-edit": "^0.0.
|
|
30
|
-
"@idlebox/
|
|
31
|
-
"@idlebox/
|
|
24
|
+
"@build-script/monorepo-lib": "^0.0.4",
|
|
25
|
+
"@idlebox/args": "^0.0.12",
|
|
26
|
+
"@idlebox/ensure-symlink": "^1.0.35",
|
|
27
|
+
"@idlebox/common": "^1.4.17",
|
|
28
|
+
"@idlebox/logger": "^0.0.5",
|
|
29
|
+
"@idlebox/json-edit": "^0.0.4",
|
|
30
|
+
"@idlebox/node": "^1.4.10",
|
|
31
|
+
"@idlebox/dependency-graph": "^0.0.4"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@rushstack/heft": "^0.74.0",
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
"@types/targz": "^1.0.5",
|
|
42
42
|
"@types/tiny-async-pool": "^2.0.3",
|
|
43
43
|
"@types/tinycolor2": "^1.4.6",
|
|
44
|
-
"@build-script/codegen": "^1.0.
|
|
45
|
-
"@build-script/single-dog-asset": "^1.0.
|
|
44
|
+
"@build-script/codegen": "^1.0.5",
|
|
45
|
+
"@build-script/single-dog-asset": "^1.0.38",
|
|
46
46
|
"@internal/local-rig": "^1.0.1",
|
|
47
|
-
"@mpis/run": "^0.0.
|
|
47
|
+
"@mpis/run": "^0.0.5"
|
|
48
48
|
},
|
|
49
49
|
"license": "MIT",
|
|
50
50
|
"author": "GongT <admin@gongt.me>",
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* GENERATED FILE, DO NOT MODIFY
|
|
8
8
|
* 这是生成的文件,千万不要修改
|
|
9
9
|
*
|
|
10
|
-
* @build-script/codegen 1.0.
|
|
10
|
+
* @build-script/codegen 1.0.5 - The Simple Code Generater
|
|
11
11
|
* https://github.com/GongT/baobao
|
|
12
12
|
*
|
|
13
13
|
******************************************************************************/
|
|
@@ -17,6 +17,7 @@ export default {
|
|
|
17
17
|
"monorepo-bump-version": "./commands/monorepo-bump-version.js",
|
|
18
18
|
"monorepo-cnpm-sync": "./commands/monorepo-cnpm-sync.js",
|
|
19
19
|
"monorepo-invalid": "./commands/monorepo-invalid.js",
|
|
20
|
+
"monorepo-link-binaries": "./commands/monorepo-link-binaries.js",
|
|
20
21
|
"monorepo-list": "./commands/monorepo-list.js",
|
|
21
22
|
"monorepo-publish": "./commands/monorepo-publish.js",
|
|
22
23
|
"monorepo-tsconfig": "./commands/monorepo-tsconfig.js",
|
|
@@ -5,8 +5,8 @@ import { resolve } from 'node:path';
|
|
|
5
5
|
export async function generate(ctx: GenerateContext) {
|
|
6
6
|
const map = {};
|
|
7
7
|
const root = resolve(__dirname, 'commands');
|
|
8
|
-
ctx.watchFiles(root
|
|
9
|
-
ctx.watchFiles(root
|
|
8
|
+
ctx.watchFiles(`${root}/**/*.ts`);
|
|
9
|
+
ctx.watchFiles(`${root}/`);
|
|
10
10
|
for (const name of readdirSync(root)) {
|
|
11
11
|
if (!name.endsWith('.ts')) {
|
|
12
12
|
continue;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createWorkspaceOrPackage } from '@build-script/monorepo-lib';
|
|
1
2
|
import { logger } from '@idlebox/logger';
|
|
2
3
|
import { printLine } from '@idlebox/node';
|
|
3
4
|
import { argv, CommandDefine, isJsonOutput, pArgS } from '../common/functions/cli.js';
|
|
@@ -20,7 +21,8 @@ export class Command extends CommandDefine {
|
|
|
20
21
|
export async function main() {
|
|
21
22
|
const autoInc = argv.flag('--bump');
|
|
22
23
|
|
|
23
|
-
const
|
|
24
|
+
const workspace = await createWorkspaceOrPackage();
|
|
25
|
+
const pm = await createPackageManager(PackageManagerUsageKind.Read, workspace);
|
|
24
26
|
|
|
25
27
|
const pkgJson = await pm.loadPackageJson();
|
|
26
28
|
const { changedFiles, hasChange, remoteVersion } = await executeChangeDetect(pm, {});
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { createWorkspace, type IPackageInfo, type MonorepoWorkspace } from '@build-script/monorepo-lib';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { humanDate } from '@idlebox/common';
|
|
3
|
+
import { Job, JobGraphBuilder } from '@idlebox/dependency-graph';
|
|
4
4
|
import { logger } from '@idlebox/logger';
|
|
5
5
|
import { makeRe } from 'minimatch';
|
|
6
|
-
import { inspect } from 'node:util';
|
|
7
6
|
import { argv, CommandDefine, CSI } from '../common/functions/cli.js';
|
|
8
7
|
import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
|
|
9
8
|
import { increaseVersion } from '../common/package-manager/package-json.js';
|
|
@@ -23,31 +22,26 @@ export class Command extends CommandDefine {
|
|
|
23
22
|
};
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
interface
|
|
25
|
+
interface IPayload {
|
|
27
26
|
readonly index: number;
|
|
28
27
|
readonly length: number;
|
|
29
28
|
readonly options: ReturnType<typeof options>;
|
|
30
29
|
readonly changedPackages: string[];
|
|
31
30
|
}
|
|
32
31
|
|
|
33
|
-
class BumpVersionJob
|
|
34
|
-
private readonly _onSuccess = new Emitter<void>();
|
|
35
|
-
public readonly onSuccess = this._onSuccess.event;
|
|
36
|
-
|
|
37
|
-
private readonly _onFailed = new Emitter<Error>();
|
|
38
|
-
public readonly onFailed = this._onFailed.event;
|
|
39
|
-
|
|
40
|
-
private readonly _onRunning = new Emitter<void>();
|
|
41
|
-
public readonly onRunning = this._onRunning.event;
|
|
42
|
-
|
|
32
|
+
class BumpVersionJob extends Job<void> {
|
|
43
33
|
constructor(
|
|
44
|
-
|
|
34
|
+
name: string,
|
|
35
|
+
deps: readonly string[],
|
|
36
|
+
private readonly payload: IPayload,
|
|
45
37
|
private readonly project: IPackageInfo,
|
|
46
38
|
private readonly workspace: MonorepoWorkspace,
|
|
47
|
-
) {
|
|
39
|
+
) {
|
|
40
|
+
super(name, deps);
|
|
41
|
+
}
|
|
48
42
|
|
|
49
|
-
async
|
|
50
|
-
const { index, length, options, changedPackages } = this.
|
|
43
|
+
protected override async _execute() {
|
|
44
|
+
const { index, length, options, changedPackages } = this.payload;
|
|
51
45
|
const w = length.toFixed(0).length;
|
|
52
46
|
console.log(`📦 [${(index + 1).toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
|
|
53
47
|
if (this.project.packageJson.private && !options.allowPrivate) {
|
|
@@ -85,18 +79,13 @@ class BumpVersionJob implements IWatchEvents {
|
|
|
85
79
|
}
|
|
86
80
|
}
|
|
87
81
|
}
|
|
88
|
-
|
|
89
|
-
[inspect.custom]() {
|
|
90
|
-
// TODO
|
|
91
|
-
return '~~~~~~~~';
|
|
92
|
-
}
|
|
93
82
|
}
|
|
94
83
|
|
|
95
84
|
function options() {
|
|
96
85
|
const excludes = argv.multiple('--exclude');
|
|
97
86
|
let excludeReg: RegExp | undefined;
|
|
98
87
|
if (excludes.length > 0) {
|
|
99
|
-
|
|
88
|
+
const regTxt = [];
|
|
100
89
|
for (const exclude of excludes) {
|
|
101
90
|
const match = makeRe(exclude, { platform: 'linux' });
|
|
102
91
|
if (!match) {
|
|
@@ -135,7 +124,7 @@ export async function main() {
|
|
|
135
124
|
await workspace.decoupleDependencies();
|
|
136
125
|
const projects = await workspace.listPackages();
|
|
137
126
|
|
|
138
|
-
const graph = new
|
|
127
|
+
const graph = new JobGraphBuilder(1, logger);
|
|
139
128
|
|
|
140
129
|
const opts = options();
|
|
141
130
|
|
|
@@ -146,9 +135,9 @@ export async function main() {
|
|
|
146
135
|
if (!project.packageJson.name) continue;
|
|
147
136
|
|
|
148
137
|
graph.addNode(
|
|
149
|
-
project.packageJson.name,
|
|
150
|
-
[],
|
|
151
138
|
new BumpVersionJob(
|
|
139
|
+
project.packageJson.name,
|
|
140
|
+
[],
|
|
152
141
|
{
|
|
153
142
|
index,
|
|
154
143
|
length: projects.length,
|
|
@@ -163,7 +152,7 @@ export async function main() {
|
|
|
163
152
|
index++;
|
|
164
153
|
}
|
|
165
154
|
|
|
166
|
-
await graph.startup();
|
|
155
|
+
await graph.finalize().startup();
|
|
167
156
|
|
|
168
157
|
console.log(`🎉 所有任务完成,共修改了 ${changedPackages.length} 个包`);
|
|
169
158
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { createWorkspace } from '@build-script/monorepo-lib';
|
|
2
2
|
import { argv } from '@idlebox/args/default';
|
|
3
3
|
import { CommandDefine, isQuiet, pDesc } from '../common/functions/cli.js';
|
|
4
|
-
import {
|
|
4
|
+
import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
|
|
5
|
+
import { createPackageManager } from '../common/package-manager/package-manager.js';
|
|
6
|
+
import { clearNpmMetaCache } from '../common/shared-jobs/clear-cache.js';
|
|
7
|
+
import { cnpmSyncNames } from '../common/shared-jobs/cnpm-sync.js';
|
|
5
8
|
|
|
6
9
|
export class Command extends CommandDefine {
|
|
7
10
|
protected override _usage = '';
|
|
@@ -15,5 +18,14 @@ export async function main() {
|
|
|
15
18
|
|
|
16
19
|
const dry = argv.flag('--dry') > 0;
|
|
17
20
|
|
|
18
|
-
|
|
21
|
+
const names = list
|
|
22
|
+
.filter((e) => {
|
|
23
|
+
return !!e.packageJson.name && !e.packageJson.private;
|
|
24
|
+
})
|
|
25
|
+
.map((e) => e.packageJson.name);
|
|
26
|
+
|
|
27
|
+
await cnpmSyncNames(names, isQuiet, dry);
|
|
28
|
+
|
|
29
|
+
const pm = await createPackageManager(PackageManagerUsageKind.Read, workspace);
|
|
30
|
+
await clearNpmMetaCache(pm, names);
|
|
19
31
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createWorkspace } from '@build-script/monorepo-lib';
|
|
1
2
|
import { logger } from '@idlebox/logger';
|
|
2
3
|
import { CommandDefine } from '../common/functions/cli.js';
|
|
3
4
|
import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
|
|
@@ -10,10 +11,11 @@ export class Command extends CommandDefine {
|
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
export async function main() {
|
|
13
|
-
const
|
|
14
|
+
const workspace = await createWorkspace();
|
|
15
|
+
const packageManager = await createPackageManager(PackageManagerUsageKind.Read, workspace);
|
|
14
16
|
const cache = await packageManager.createCacheHandler();
|
|
15
17
|
|
|
16
|
-
const list = await
|
|
18
|
+
const list = await workspace.listPackages();
|
|
17
19
|
|
|
18
20
|
logger.log('删除%d个项目在 %s 的npm缓存', list.length, cache.path);
|
|
19
21
|
for (const data of list) {
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { createWorkspace, type MonorepoWorkspace } from '@build-script/monorepo-lib';
|
|
2
|
+
import { argv } from '@idlebox/args/default';
|
|
3
|
+
import type { DeepReadonly, IPackageJson } from '@idlebox/common';
|
|
4
|
+
import { ensureLinkTargetSync } from '@idlebox/ensure-symlink';
|
|
5
|
+
import { logger } from '@idlebox/logger';
|
|
6
|
+
import { relativePath } from '@idlebox/node';
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
import { basename, resolve } from 'node:path';
|
|
9
|
+
import { CommandDefine, pArgS } from '../common/functions/cli.js';
|
|
10
|
+
|
|
11
|
+
export class Command extends CommandDefine {
|
|
12
|
+
protected override _usage = `${pArgS('--from=...')} ${pArgS('--recursive')}`;
|
|
13
|
+
protected override _description = '将monorepo中每个项目的bins连接到当前项目的 ./node_modules/.bin';
|
|
14
|
+
protected override _help = '存在bin同名时,monorepo项目优先于npm包';
|
|
15
|
+
protected override _arguments = {
|
|
16
|
+
'--from': {
|
|
17
|
+
flag: false,
|
|
18
|
+
description: '将<value>视为各个项目的直接依赖 (必须是至少一个项目的依赖,否则找不到)',
|
|
19
|
+
},
|
|
20
|
+
'--transparent': {
|
|
21
|
+
flag: false,
|
|
22
|
+
description: '将<value>的所有直接依赖视为此项目的直接依赖',
|
|
23
|
+
},
|
|
24
|
+
'--recursive': { flag: true, description: '在每个项目中运行,而非当前项目' },
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface BinaryDefine {
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly absolutePath: string;
|
|
31
|
+
}
|
|
32
|
+
interface IJobContext {
|
|
33
|
+
readonly packageRoot: string;
|
|
34
|
+
readonly deps: readonly BinaryDefine[];
|
|
35
|
+
readonly globalDeps: readonly BinaryDefine[];
|
|
36
|
+
readonly monorepo: readonly BinaryDefine[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function main() {
|
|
40
|
+
const recursiveMode = argv.flag('--recursive') > 0;
|
|
41
|
+
|
|
42
|
+
const workspace = await createWorkspace();
|
|
43
|
+
|
|
44
|
+
const localPackages = [];
|
|
45
|
+
const projectList = await workspace.listPackages();
|
|
46
|
+
for (const pkg of projectList) {
|
|
47
|
+
if (!pkg.packageJson.name) continue;
|
|
48
|
+
localPackages.push(pkg.packageJson.name);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const additionalPackages = new Set(argv.multiple('--from'));
|
|
52
|
+
for (const projectName of argv.multiple('--transparent')) {
|
|
53
|
+
const proj = await workspace.getPackage(projectName);
|
|
54
|
+
if (!proj) {
|
|
55
|
+
throw new Error(`missing transparent project: ${projectName}`);
|
|
56
|
+
}
|
|
57
|
+
for (const item of depNames(proj.packageJson)) {
|
|
58
|
+
additionalPackages.add(item);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
for (const name of additionalPackages) {
|
|
63
|
+
if (await workspace.getPackage(name)) {
|
|
64
|
+
throw new Error('--from can not be a local package');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const locals = await createBins(workspace, localPackages);
|
|
69
|
+
const globals = await createBins(workspace, [...additionalPackages]);
|
|
70
|
+
|
|
71
|
+
if (recursiveMode) {
|
|
72
|
+
for (const pkg of projectList) {
|
|
73
|
+
const current = await createBins(workspace, depNames(pkg.packageJson));
|
|
74
|
+
await execute({
|
|
75
|
+
deps: current,
|
|
76
|
+
globalDeps: globals,
|
|
77
|
+
monorepo: locals,
|
|
78
|
+
packageRoot: pkg.absolute,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
} else {
|
|
82
|
+
const pkg = await workspace.getNearestPackage(process.cwd());
|
|
83
|
+
const current = await createBins(workspace, depNames(pkg.packageJson));
|
|
84
|
+
await execute({
|
|
85
|
+
deps: current,
|
|
86
|
+
globalDeps: globals,
|
|
87
|
+
monorepo: locals,
|
|
88
|
+
packageRoot: pkg.absolute,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function execute(ctx: IJobContext) {
|
|
94
|
+
logger.log`linking binaries in project long<${ctx.packageRoot}>`;
|
|
95
|
+
|
|
96
|
+
const final = new Map<string, string>();
|
|
97
|
+
for (const list of [ctx.globalDeps, ctx.deps, ctx.monorepo]) {
|
|
98
|
+
for (const bin of list) {
|
|
99
|
+
final.set(bin.name, bin.absolutePath);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const dry = argv.flag('--dry') > 0;
|
|
104
|
+
const bindir = resolve(ctx.packageRoot, 'node_modules/.bin');
|
|
105
|
+
for (const [name, target] of final) {
|
|
106
|
+
const link = `${bindir}/${name}`;
|
|
107
|
+
const rel = relativePath(bindir, target);
|
|
108
|
+
if (dry) {
|
|
109
|
+
logger.success(`Would link ${link} -> ${rel}`);
|
|
110
|
+
} else {
|
|
111
|
+
const ch = ensureLinkTargetSync(rel, link);
|
|
112
|
+
if (ch) {
|
|
113
|
+
logger.success`symlink: ${name} -> ${rel}`;
|
|
114
|
+
} else {
|
|
115
|
+
logger.debug`unchanged: ${name} -> ${rel}`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function depNames(pkgJson: DeepReadonly<IPackageJson>) {
|
|
122
|
+
const o = Object.assign({}, pkgJson.dependencies, pkgJson.devDependencies, pkgJson.optionalDependencies);
|
|
123
|
+
const r: string[] = [];
|
|
124
|
+
for (const [name, version] of Object.entries(o)) {
|
|
125
|
+
if (version.startsWith('workspace:')) {
|
|
126
|
+
} else {
|
|
127
|
+
r.push(name);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return r;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async function createBins(workspace: MonorepoWorkspace, names: string[]) {
|
|
134
|
+
const bins: BinaryDefine[] = [];
|
|
135
|
+
const packageList = workspace.listPackages();
|
|
136
|
+
|
|
137
|
+
for (const want of names) {
|
|
138
|
+
for (const proj of await packageList) {
|
|
139
|
+
if (proj.name === want) {
|
|
140
|
+
makeBinMap(bins, proj.absolute, proj.packageJson);
|
|
141
|
+
}
|
|
142
|
+
const deps = depNames(proj.packageJson);
|
|
143
|
+
if (deps.includes(want)) {
|
|
144
|
+
const depRoot = resolve(proj.absolute, 'node_modules', want);
|
|
145
|
+
const pkgJson: IPackageJson = JSON.parse(readFileSync(resolve(depRoot, 'package.json'), 'utf-8'));
|
|
146
|
+
makeBinMap(bins, depRoot, pkgJson);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return bins;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function makeBinMap(result: BinaryDefine[], absolute: string, json: DeepReadonly<IPackageJson>) {
|
|
155
|
+
if (!json.bin) return;
|
|
156
|
+
|
|
157
|
+
let bins: Record<string, string> = {};
|
|
158
|
+
if (typeof json.bin === 'string') {
|
|
159
|
+
bins[basename(json.name)] = json.bin;
|
|
160
|
+
} else {
|
|
161
|
+
bins = json.bin;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
for (const [name, path] of Object.entries(bins)) {
|
|
165
|
+
const absolutePath = resolve(absolute, path);
|
|
166
|
+
result.push({ name, absolutePath });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createWorkspace,
|
|
3
|
-
normalizePackageName,
|
|
4
|
-
type IPackageInfo,
|
|
5
|
-
type MonorepoWorkspace,
|
|
6
|
-
} from '@build-script/monorepo-lib';
|
|
1
|
+
import { createWorkspace, normalizePackageName, type IPackageInfo, type MonorepoWorkspace } from '@build-script/monorepo-lib';
|
|
7
2
|
import { Emitter, prettyPrintError } from '@idlebox/common';
|
|
8
|
-
import {
|
|
3
|
+
import { Job, JobGraphBuilder } from '@idlebox/dependency-graph';
|
|
9
4
|
import { logger } from '@idlebox/logger';
|
|
10
5
|
import { commandInPath, emptyDir, writeFileIfChangeSync } from '@idlebox/node';
|
|
11
|
-
import { cpSync, existsSync } from 'fs';
|
|
12
|
-
import { resolve } from 'path';
|
|
13
|
-
import { inspect } from 'util';
|
|
6
|
+
import { cpSync, existsSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
14
8
|
import { argv, CommandDefine, CSI, pArgS } from '../common/functions/cli.js';
|
|
15
9
|
import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
|
|
16
10
|
import { increaseVersion } from '../common/package-manager/package-json.js';
|
|
17
11
|
import { createPackageManager } from '../common/package-manager/package-manager.js';
|
|
12
|
+
import { clearNpmMetaCache } from '../common/shared-jobs/clear-cache.js';
|
|
18
13
|
import { cnpmSyncNames } from '../common/shared-jobs/cnpm-sync.js';
|
|
19
14
|
import { executeChangeDetect } from '../common/shared-jobs/detect-change-job.js';
|
|
20
15
|
|
|
@@ -29,14 +24,14 @@ export class Command extends CommandDefine {
|
|
|
29
24
|
};
|
|
30
25
|
}
|
|
31
26
|
|
|
32
|
-
interface
|
|
27
|
+
interface IPayload {
|
|
33
28
|
readonly index: number;
|
|
34
29
|
readonly length: number;
|
|
35
30
|
readonly options: ReturnType<typeof options>;
|
|
36
31
|
}
|
|
37
32
|
|
|
38
33
|
let indexDisplay = 0;
|
|
39
|
-
class BuildPackageJob
|
|
34
|
+
class BuildPackageJob extends Job<void> {
|
|
40
35
|
private readonly _onSuccess = new Emitter<void>();
|
|
41
36
|
public readonly onSuccess = this._onSuccess.event;
|
|
42
37
|
|
|
@@ -49,50 +44,51 @@ class BuildPackageJob implements IWatchEvents {
|
|
|
49
44
|
private shouldPublish = '';
|
|
50
45
|
|
|
51
46
|
constructor(
|
|
52
|
-
|
|
47
|
+
name: string,
|
|
48
|
+
deps: readonly string[],
|
|
49
|
+
private readonly payload: IPayload,
|
|
53
50
|
private readonly project: IPackageInfo,
|
|
54
51
|
private readonly workspace: MonorepoWorkspace,
|
|
55
52
|
) {
|
|
53
|
+
super(name, deps);
|
|
54
|
+
|
|
56
55
|
this.onSuccess(() => {
|
|
57
56
|
indexDisplay++;
|
|
58
|
-
const { length } = this.
|
|
57
|
+
const { length } = this.payload;
|
|
59
58
|
const w = length.toFixed(0).length;
|
|
60
|
-
console.log(
|
|
59
|
+
console.log(`${CSI}K📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
|
|
61
60
|
console.log(this.logText.join('\n'));
|
|
62
61
|
this.logText.length = 0;
|
|
63
62
|
});
|
|
64
63
|
this.onFailed((e) => {
|
|
65
64
|
indexDisplay++;
|
|
66
|
-
const { length } = this.
|
|
65
|
+
const { length } = this.payload;
|
|
67
66
|
const w = length.toFixed(0).length;
|
|
68
|
-
console.log(
|
|
67
|
+
console.log(`${CSI}K📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
|
|
69
68
|
console.log(this.logText.join('\n'));
|
|
70
69
|
prettyPrintError('❌pack failed', e);
|
|
71
70
|
this.logText.length = 0;
|
|
72
71
|
});
|
|
73
72
|
}
|
|
74
73
|
|
|
75
|
-
get name() {
|
|
76
|
-
return this.project.name;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
74
|
getPackagePath() {
|
|
80
75
|
return this.shouldPublish || undefined;
|
|
81
76
|
}
|
|
82
77
|
|
|
83
|
-
async
|
|
78
|
+
protected override async _execute() {
|
|
84
79
|
this._onRunning.fire();
|
|
85
80
|
this.log(` 🔍 ${CSI}38;5;14m检查包${CSI}0m`);
|
|
86
81
|
|
|
87
82
|
const pm = await createPackageManager(PackageManagerUsageKind.Write, this.workspace, this.project.absolute);
|
|
88
83
|
const { changedFiles, hasChange, remoteVersion } = await executeChangeDetect(pm, {});
|
|
89
|
-
|
|
84
|
+
const shouldPublish = hasChange || changedFiles.length > 0;
|
|
90
85
|
let localVersion = this.project.packageJson.version;
|
|
91
86
|
|
|
87
|
+
this.log(` 👀 ${changedFiles.length} 个文件有修改: ${changedFiles.slice(0, 3).join(', ')}${changedFiles.length > 3 ? ' ...' : ''}`);
|
|
92
88
|
if (hasChange) {
|
|
93
89
|
const packageJson = await pm.loadPackageJson();
|
|
94
90
|
localVersion = await increaseVersion(packageJson, remoteVersion || '0.0.0');
|
|
95
|
-
this.log(` ✍️
|
|
91
|
+
this.log(` ✍️ 已修改本地包版本: ${localVersion}`);
|
|
96
92
|
}
|
|
97
93
|
if (!shouldPublish) {
|
|
98
94
|
this.log(` ✨ ${CSI}38;5;10m未发现修改${CSI}0m\n`);
|
|
@@ -102,16 +98,13 @@ class BuildPackageJob implements IWatchEvents {
|
|
|
102
98
|
|
|
103
99
|
this.log(` 🔄 打包文件`);
|
|
104
100
|
|
|
105
|
-
const tempFile = resolve(
|
|
106
|
-
this.workspace.temp,
|
|
107
|
-
`publish/${normalizePackageName(this.project.name)}-${localVersion}.tgz`,
|
|
108
|
-
);
|
|
101
|
+
const tempFile = resolve(this.workspace.temp, `publish/${normalizePackageName(this.project.name)}-${localVersion}.tgz`);
|
|
109
102
|
this.shouldPublish = await pm.pack(tempFile);
|
|
110
103
|
|
|
111
104
|
if (remoteVersion) {
|
|
112
|
-
this.log(` 🎈 即将发布新版本 "${
|
|
105
|
+
this.log(` 🎈 即将发布新版本 "${localVersion}" 以更新远程版本 "${remoteVersion}"`);
|
|
113
106
|
} else {
|
|
114
|
-
this.log(` 🎈 即将发布初始版本 "${
|
|
107
|
+
this.log(` 🎈 即将发布初始版本 "${localVersion}"`);
|
|
115
108
|
}
|
|
116
109
|
this._onSuccess.fire();
|
|
117
110
|
}
|
|
@@ -120,11 +113,6 @@ class BuildPackageJob implements IWatchEvents {
|
|
|
120
113
|
log(text: string) {
|
|
121
114
|
this.logText.push(text);
|
|
122
115
|
}
|
|
123
|
-
|
|
124
|
-
[inspect.custom]() {
|
|
125
|
-
// TODO
|
|
126
|
-
return '~~~~~~~~';
|
|
127
|
-
}
|
|
128
116
|
}
|
|
129
117
|
|
|
130
118
|
function options() {
|
|
@@ -144,8 +132,12 @@ export async function main() {
|
|
|
144
132
|
|
|
145
133
|
const projects = await workspace.listPackages();
|
|
146
134
|
|
|
147
|
-
const concurrency = argv.flag(['--debug', '-d']) > 0 ? 1 : 10;
|
|
148
|
-
|
|
135
|
+
const concurrency = 1; // argv.flag(['--debug', '-d']) > 0 ? 1 : 10;
|
|
136
|
+
if (concurrency === 1) {
|
|
137
|
+
logger.warn`由于设置了--debug参数,运行模式改为单线程`;
|
|
138
|
+
}
|
|
139
|
+
const builder = new JobGraphBuilder(concurrency, logger);
|
|
140
|
+
|
|
149
141
|
const opts = options();
|
|
150
142
|
|
|
151
143
|
const shouldPublishProjects = projects.filter((project) => {
|
|
@@ -154,7 +146,7 @@ export async function main() {
|
|
|
154
146
|
if (project.packageJson.private) {
|
|
155
147
|
console.log(`📦 ${project.name}`);
|
|
156
148
|
console.log(` 🛑 跳过,private=true: ${project.name}`);
|
|
157
|
-
|
|
149
|
+
builder.addEmptyNode(project.name);
|
|
158
150
|
return false;
|
|
159
151
|
}
|
|
160
152
|
|
|
@@ -163,28 +155,37 @@ export async function main() {
|
|
|
163
155
|
|
|
164
156
|
let index = 0;
|
|
165
157
|
for (const project of shouldPublishProjects) {
|
|
166
|
-
|
|
158
|
+
const job = new BuildPackageJob(
|
|
167
159
|
project.name,
|
|
168
160
|
project.devDependencies,
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
workspace,
|
|
177
|
-
),
|
|
161
|
+
{
|
|
162
|
+
index,
|
|
163
|
+
length: shouldPublishProjects.length,
|
|
164
|
+
options: opts,
|
|
165
|
+
},
|
|
166
|
+
project,
|
|
167
|
+
workspace,
|
|
178
168
|
);
|
|
179
169
|
|
|
170
|
+
job.onRunning(debugSummary);
|
|
171
|
+
job.onSuccess(debugSummary);
|
|
172
|
+
job.onFailed(debugSummary);
|
|
173
|
+
builder.addNode(job);
|
|
174
|
+
|
|
180
175
|
index++;
|
|
181
176
|
}
|
|
182
177
|
|
|
178
|
+
const graph = builder.finalize();
|
|
179
|
+
|
|
180
|
+
function debugSummary() {
|
|
181
|
+
const info = graph?.debugFormatSummary();
|
|
182
|
+
process.stderr.write(`${CSI}K${info}\r`);
|
|
183
|
+
}
|
|
183
184
|
await graph.startup();
|
|
184
185
|
|
|
185
186
|
const packageToPublish: { name: string; pack: string }[] = [];
|
|
186
187
|
for (const id of graph.overallOrder) {
|
|
187
|
-
const node = graph.
|
|
188
|
+
const node = graph.getNodeByName(id);
|
|
188
189
|
if (!(node instanceof BuildPackageJob)) continue;
|
|
189
190
|
|
|
190
191
|
const pack = node.getPackagePath();
|
|
@@ -202,17 +203,17 @@ export async function main() {
|
|
|
202
203
|
const npmrc = workspace.getNpmRCPath(true);
|
|
203
204
|
if (existsSync(npmrc)) {
|
|
204
205
|
cpSync(npmrc, resolve(temp, '.npmrc'));
|
|
205
|
-
writeFileIfChangeSync(resolve(temp, 'package.json'), '{}');
|
|
206
206
|
}
|
|
207
|
+
writeFileIfChangeSync(resolve(temp, 'package.json'), '{}');
|
|
207
208
|
|
|
208
209
|
const w = packageToPublish.length.toFixed(0).length;
|
|
209
|
-
|
|
210
|
+
const published: string[] = [];
|
|
210
211
|
|
|
211
212
|
try {
|
|
212
213
|
index = 1;
|
|
213
214
|
for (const { name, pack } of packageToPublish) {
|
|
214
215
|
console.log(`📦 [${index.toFixed(0).padStart(w)}/${packageToPublish.length}] ${name}`);
|
|
215
|
-
const r = await pm.uploadTarball(pack);
|
|
216
|
+
const r = await pm.uploadTarball(pack, temp);
|
|
216
217
|
if (r.published) {
|
|
217
218
|
console.log(` 👌 已发布新版本 ${r.version}`);
|
|
218
219
|
} else {
|
|
@@ -228,8 +229,11 @@ export async function main() {
|
|
|
228
229
|
logger.error`发布过程中发生错误: ${e instanceof Error ? e.message : e}`;
|
|
229
230
|
throw e;
|
|
230
231
|
} finally {
|
|
231
|
-
if (await commandInPath('cnpm')) {
|
|
232
|
-
await cnpmSyncNames(published, true)
|
|
232
|
+
if (published.length > 0 && (await commandInPath('cnpm'))) {
|
|
233
|
+
await cnpmSyncNames(published, true);
|
|
234
|
+
|
|
235
|
+
const pm = await createPackageManager(PackageManagerUsageKind.Read, workspace);
|
|
236
|
+
await clearNpmMetaCache(pm, published);
|
|
233
237
|
}
|
|
234
238
|
}
|
|
235
239
|
}
|
|
@@ -10,8 +10,7 @@ import { argv, CommandDefine, pArgS } from '../common/functions/cli.js';
|
|
|
10
10
|
export class Command extends CommandDefine {
|
|
11
11
|
protected override _usage = `${pArgS('--dev')}`;
|
|
12
12
|
protected override _description = '为所有项目的 tsconfig.json 添加 references 字段';
|
|
13
|
-
protected override _help =
|
|
14
|
-
`查找tsconfig.json和src/tsconfig.json\n 如果不在这里,可以在package.json中设置exports['./tsconfig.json'] = './xxxx'`;
|
|
13
|
+
protected override _help = `查找tsconfig.json和src/tsconfig.json\n 如果不在这里,可以在package.json中设置exports['./tsconfig.json'] = './xxxx'`;
|
|
15
14
|
protected override _arguments = {
|
|
16
15
|
'--dev': { flag: true, description: '也将devDependencies中的包添加到references中' },
|
|
17
16
|
};
|