@bams-app/work-cli 0.0.9 → 0.1.0
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/README.md +76 -92
- package/bin/work-cli.js +6 -6
- package/commands/add.js +1 -1
- package/commands/create.js +8 -77
- package/commands/dev.js +4 -0
- package/package.json +3 -5
- package/templates/project/.proxy.js.example +10 -1
- package/templates/project/README.md +68 -30
- package/templates/project/gitignore.tpl +0 -3
- package/templates/project/package.json +4 -20
- package/commands/update.js +0 -119
package/README.md
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
# @bams-app/work-cli
|
|
2
2
|
|
|
3
|
-
BAMS-Work
|
|
3
|
+
BAMS-Work 全局脚手架工具(类似 vue-cli 模式),提供**项目初始化**、**组件创建**与**环境配置**能力。
|
|
4
|
+
开发调试由用户项目**本地的** `@bams-app/ui-dev-server` 承担(`npm run dev:ui <环境标识>`),全局 CLI 不参与启动开发服务。
|
|
4
5
|
|
|
5
6
|
## 设计思路
|
|
6
7
|
|
|
7
8
|
`work-cli` 是**薄壳**,不内嵌任何服务/能力包代码(仅内嵌脚手架项目模板 `templates/project/`),
|
|
8
9
|
全部复用 work 仓库发布到 npm 的包:
|
|
9
10
|
|
|
10
|
-
| 能力
|
|
11
|
-
|
|
|
12
|
-
| 项目/组件创建 | `@bams-app/create-ui-component`、`@bams-app/create-ui-page`、`@bams-app/create-ui-base`(内部引用 `@bams-app/ui-*-template`)
|
|
13
|
-
| 开发服务
|
|
14
|
-
| 环境变量加载
|
|
15
|
-
| 环境配置创建
|
|
16
|
-
| 动态入口生成
|
|
17
|
-
| 批量页面创建
|
|
18
|
-
| 公共配置
|
|
11
|
+
| 能力 | 来源包 |
|
|
12
|
+
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| 项目/组件创建 | `@bams-app/create-ui-component`、`@bams-app/create-ui-page`、`@bams-app/create-ui-base`(内部引用 `@bams-app/ui-*-template`) |
|
|
14
|
+
| 开发服务 | `@bams-app/ui-dev-server`(由模板写入用户项目 `devDependencies`,`npm run dev:ui <环境标识>` 本地启动;环境标识由第 1 个位置参数传入) |
|
|
15
|
+
| 环境变量加载 | `@bams-app/shared-env`(同上;其 `lib/env-loader` 被 ui-dev-server 复用于解析环境标识) |
|
|
16
|
+
| 环境配置创建 | `@bams-app/create-env`(交互式生成 `.envs/.env.dev-<alias>`) |
|
|
17
|
+
| 动态入口生成 | `@bams-app/create-pages-entry`(扫描 page-_/ui-_ 生成 build-components-entry.js) |
|
|
18
|
+
| 批量页面创建 | `@bams-app/create-pages-from-components`(批量将 ui-_ 转为 page-_,复用 create-ui-page) |
|
|
19
|
+
| 公共配置 | `@bams-app/configs`(app-config.json、可配置组件插槽默认值,被 ui-dev-server 与 store 依赖) |
|
|
19
20
|
|
|
20
21
|
- `create` 生成 **scope 目录模式** Monorepo:根 `workspaces: ["demo-ui/*", "bams-components/*", "*-ui/*", "apex-web/*", "bams-ui"]`,
|
|
21
22
|
业务组件按 scope 目录存放(`energy-ui/ui-xxx`)。
|
|
22
23
|
- `workspaces` 与仓库根 `package.json` 保持一致:`bams-components/*`、`apex-web/*` 等 glob 用于兼容
|
|
23
24
|
用户克隆进项目的既有组件包仓库(目录不存在时不影响安装,`create` 也不会默认创建它们)。
|
|
24
|
-
- 项目根 `package.json`
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
`
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
- 所有命令通过 `require.resolve()` 定位 work 包 bin 并以子进程委托执行,`WORK_PROJECT_ROOT` 环境变量注入项目根。
|
|
25
|
+
- 项目根 `package.json` 的 `devDependencies` **只声明 `@bams-app/ui-dev-server` 一个**:
|
|
26
|
+
能力包(`@bams-app/*`)与运行时依赖(vue、ant-design-vue、devextreme 等)的清单只在
|
|
27
|
+
ui-dev-server 的 `dependencies` 维护**一处**,安装后提升到项目根 `node_modules`,
|
|
28
|
+
webpack 的 `resolve.modules` 即指向该处,版本随 ui-dev-server 走。
|
|
29
|
+
`create` **不生成**项目 `.npmrc`(`@bams-app/*` 默认走官方 npm)。
|
|
30
|
+
- 开发调试**不经过 CLI**:`npm run dev:ui <环境标识> [组件名]` 即项目本地的 `ui-dev-server`
|
|
31
|
+
(npm 走 `node_modules/.bin`),环境文件由其自行加载,追加的位置参数覆盖默认值。
|
|
32
|
+
- 其余命令通过 `require.resolve()` 定位 work 包 bin 并以子进程委托执行,`WORK_PROJECT_ROOT` 环境变量注入项目根。
|
|
33
33
|
|
|
34
34
|
### 整体架构
|
|
35
35
|
|
|
@@ -43,19 +43,20 @@ flowchart LR
|
|
|
43
43
|
C["@bams-app/*"]
|
|
44
44
|
end
|
|
45
45
|
subgraph CLI["@bams-app/work-cli(全局 CLI)"]
|
|
46
|
-
D["create / add /
|
|
46
|
+
D["create / add / env<br/>pages-entry / pages-from-components"]
|
|
47
47
|
end
|
|
48
48
|
subgraph PROJ["用户项目(Monorepo)"]
|
|
49
|
-
E["package.json<br
|
|
50
|
-
F["npm install<br
|
|
49
|
+
E["package.json<br/>devDependencies:仅 ui-dev-server"]
|
|
50
|
+
F["npm install<br/>依赖自动安装"]
|
|
51
|
+
G["npm run dev:ui 环境标识<br/>本地 ui-dev-server"]
|
|
51
52
|
end
|
|
52
53
|
A -->|"publish-all / 单包 npm publish"| C
|
|
53
54
|
B -->|"发布 + 依赖声明"| C
|
|
54
55
|
C -->|"registry 安装"| CLI
|
|
55
|
-
C -->|"
|
|
56
|
-
CLI -->|"create 以 file: 注入"| PROJ
|
|
56
|
+
C -->|"registry 安装(ui-dev-server + 能力包 + 运行时依赖)"| PROJ
|
|
57
57
|
CLI -->|"子进程委托 work 包 bin"| B
|
|
58
58
|
E --> F
|
|
59
|
+
F --> G
|
|
59
60
|
```
|
|
60
61
|
|
|
61
62
|
```
|
|
@@ -84,32 +85,25 @@ bams-work create my-bams-project
|
|
|
84
85
|
cd my-bams-project
|
|
85
86
|
npm install
|
|
86
87
|
|
|
87
|
-
#
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
# 启动开发环境(项目本地 ui-dev-server,环境标识用位置参数传入,不加 -- 分隔符)
|
|
89
|
+
npm run dev:ui demo # 加载 .envs/.env.dev-demo + 组件 ui-component-demo
|
|
90
|
+
npm run dev:ui demo ui-order-list # 指定组件(`-c ui-order-list` 等价)
|
|
90
91
|
|
|
91
92
|
# 在 scope 目录下创建新组件
|
|
92
93
|
bams-work add --dir energy-ui --name ui-order-list
|
|
93
94
|
bams-work add --dir energy-ui --name page-order-list --type page
|
|
94
95
|
bams-work add --dir demo-ui --name ui-base-btn --type base
|
|
95
|
-
|
|
96
|
-
# 升级 @bams-app 包(查询最新版并重装依赖)
|
|
97
|
-
bams-work update
|
|
98
96
|
```
|
|
99
97
|
|
|
100
98
|
### 命令一览
|
|
101
99
|
|
|
102
|
-
| 命令
|
|
103
|
-
|
|
|
104
|
-
| `create <name>`
|
|
105
|
-
| `add --dir <scope> --name <name>`
|
|
106
|
-
| `
|
|
107
|
-
| `
|
|
108
|
-
| `
|
|
109
|
-
| `pages-entry --dir <dir> --type <page\|component>` | 扫描 page-*/ui-* 目录生成 webpack 动态入口(复用 create-pages-entry) |
|
|
110
|
-
| `pages-from-components --dir <dir>` | 批量将 ui-* 组件转为 page-* 页面(复用 create-pages-from-components) |
|
|
111
|
-
|
|
112
|
-
> `build`、`umd` 命令暂时下线(入口与示例均已移除),暂不可用。
|
|
100
|
+
| 命令 | 说明 |
|
|
101
|
+
| -------------------------------------------------- | --------------------------------------------------------------------- |
|
|
102
|
+
| `create <name>` | 初始化 Monorepo 项目模版(含示例组件与 `.bams-work/` 标记) |
|
|
103
|
+
| `add --dir <scope> --name <name>` | 在 scope 目录下创建组件(component/page/base),并注册 workspace |
|
|
104
|
+
| `env` | 交互式创建开发环境配置 `.envs/.env.dev-<alias>`(复用 create-env) |
|
|
105
|
+
| `pages-entry --dir <dir> --type <page\|component>` | 扫描 page-_/ui-_ 目录生成 webpack 动态入口(复用 create-pages-entry) |
|
|
106
|
+
| `pages-from-components --dir <dir>` | 批量将 ui-_ 组件转为 page-_ 页面(复用 create-pages-from-components) |
|
|
113
107
|
|
|
114
108
|
### 组件目录规范
|
|
115
109
|
|
|
@@ -118,8 +112,12 @@ bams-work update
|
|
|
118
112
|
|
|
119
113
|
## 开发环境机制
|
|
120
114
|
|
|
121
|
-
- `.envs/.env.dev-<env>`:环境配置,`dev <env>`
|
|
122
|
-
-
|
|
115
|
+
- `.envs/.env.dev-<env>`:环境配置,`npm run dev:ui <env>` 时由项目本地 `ui-dev-server` 加载
|
|
116
|
+
(复用 `@bams-app/shared-env` 的 `lib/env-loader`,支持 `#` 注释、`export` 前缀、引号、`${VAR}` 引用,
|
|
117
|
+
以及项目根同名文件覆盖)。
|
|
118
|
+
- 代理:项目根 `.proxy.js`(可选,参考 `.proxy.js.example`)。其中声明的前缀优先于内置默认
|
|
119
|
+
前缀(`/bams-assets`、`/bams-ui-umd`、`/bams-app`、`/admin-api`、`/preview`,target 取
|
|
120
|
+
`PROXY_TARGET`)且内置默认仅补充未声明项;键序即匹配序(精确 path 请写在前面),修改后需重启。
|
|
123
121
|
- webpack 扩展:项目根 `vue.config.extend.js`(导出对象或 `({ env, projectRoot }) => 对象`)。
|
|
124
122
|
- 可配置插槽:`COMPONENT_*` 环境变量 + `@configurable/*` 别名(login / header / startr-layout)。
|
|
125
123
|
- 能力包可选组件(未安装时)由 `OPTIONAL_PACKAGE_FALLBACKS` 兜底 alias 到空入口,保证编译不报错。
|
|
@@ -157,49 +155,53 @@ cd work/configs && npm publish --registry=https://registry.npmjs.org/
|
|
|
157
155
|
单包发布只影响该包,其他包版本号不变;需要整体提升版本时使用 `yarn publish-all`。
|
|
158
156
|
发布官方 npm 时 `@bams-app` scope 会随首个 scoped 包自动创建,无需预先注册。
|
|
159
157
|
|
|
160
|
-
|
|
161
|
-
统一声明,发布后随 `npm install` 自动安装到用户项目,无需逐包注入。
|
|
162
|
-
|
|
163
|
-
`work-cli` 与 `create` 生成的项目均以 `"*"` 声明 `@bams-app/*` 依赖:仓库内经 yarn
|
|
158
|
+
`work-cli` 与 `create` 生成的项目均以 `"*"` 声明 `@bams-app/ui-dev-server`:仓库内经 yarn
|
|
164
159
|
workspaces 链接到本地包,发布后自动解析为 registry 上最新的已发布版本,无需手动改版本号。
|
|
165
160
|
|
|
166
161
|
## 用户项目升级
|
|
167
162
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
dependencies(`"*"`)传递安装。
|
|
171
|
-
|
|
172
|
-
### 一键升级(推荐)
|
|
163
|
+
用户项目的 `devDependencies` 只声明 `@bams-app/ui-dev-server` 一个(`"*"`),能力包与
|
|
164
|
+
运行时依赖全部作为它的传递依赖解析到同一份包,提升到项目根 `node_modules`。
|
|
173
165
|
|
|
174
|
-
|
|
175
|
-
bams-work update
|
|
176
|
-
```
|
|
166
|
+
### 为什么直接用 npm 命令带不动这些依赖
|
|
177
167
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
168
|
+
能力包在 ui-dev-server 里声明为 `"*"`,运行时依赖是普通版本范围,而项目
|
|
169
|
+
`package-lock.json` 已把它们逐个钉死在具体版本、且仍满足声明范围,npm 便不再重新解析:
|
|
170
|
+
`npm install` 与 `npm update @bams-app/ui-dev-server` 都不会动它们;裸 `npm update` 虽能带上,
|
|
171
|
+
但会重解析整棵依赖树、顺带升级其它第三方依赖。所以只能清掉它们在 lockfile 里的记录,
|
|
172
|
+
让 npm 重新解析。
|
|
181
173
|
|
|
182
|
-
###
|
|
183
|
-
|
|
184
|
-
需先在项目根创建 `.npmrc` 并写入 `install-links=true`(`create` 不再生成),使能力包以复制
|
|
185
|
-
方式安装并解析其全部传递依赖。npm 对已安装的 file: 依赖会直接跳过(即使源码已变化),
|
|
186
|
-
`bams-work update` 会先清除 node_modules 中全部 file: 依赖缓存再重装,强制重新复制 work
|
|
187
|
-
本地最新源码:
|
|
174
|
+
### 升级步骤
|
|
188
175
|
|
|
189
176
|
```bash
|
|
190
|
-
|
|
177
|
+
# 1. 按 ui-dev-server 的依赖清单清理 package-lock.json
|
|
178
|
+
node -e "
|
|
179
|
+
const fs = require('fs');
|
|
180
|
+
const dev = JSON.parse(fs.readFileSync('node_modules/@bams-app/ui-dev-server/package.json', 'utf8'));
|
|
181
|
+
const names = new Set([...Object.keys(dev.dependencies || {}), '@bams-app/ui-dev-server']);
|
|
182
|
+
const lock = JSON.parse(fs.readFileSync('package-lock.json', 'utf8'));
|
|
183
|
+
let removed = 0;
|
|
184
|
+
for (const section of ['packages', 'dependencies']) {
|
|
185
|
+
const container = lock[section];
|
|
186
|
+
if (!container) continue;
|
|
187
|
+
for (const key of Object.keys(container)) {
|
|
188
|
+
const name = key.replace(/^.*node_modules\//, '');
|
|
189
|
+
if (names.has(name)) { delete container[key]; removed++; }
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
fs.writeFileSync('package-lock.json', JSON.stringify(lock, null, 2) + '\n');
|
|
193
|
+
console.log('已清理', removed, '条由 ui-dev-server 提供的依赖记录');
|
|
194
|
+
"
|
|
195
|
+
|
|
196
|
+
# 2. 这些包按 ui-dev-server 声明的版本重新解析,其余依赖保持锁定不动
|
|
197
|
+
npm install
|
|
191
198
|
```
|
|
192
199
|
|
|
193
|
-
|
|
200
|
+
清理范围必须覆盖 ui-dev-server 声明的**全部**依赖:只删 `@bams-app/*` 的话,能力包会刷新,
|
|
201
|
+
但 vue / axios 等运行时依赖仍停在 lockfile 里的旧版本。
|
|
194
202
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
| 常规升级(同大版本线 0.1.x) | `npm update @bams-app/ui-dev-server` |
|
|
198
|
-
| 跨大版本(0.1 → 0.2) | 改 package.json 为 `"@bams-app/ui-dev-server": "^0.2.0"` 后 `npm install` |
|
|
199
|
-
| 全部能力包强制最新 | `npm update`,或删除 node_modules 与 package-lock.json 后重装 |
|
|
200
|
-
|
|
201
|
-
`npm update <pkg>` 会把 ui-dev-server 升到其版本范围允许的最新版,并同步更新依赖树中的
|
|
202
|
-
能力包(`"*"` 范围 → 最新);跨大版本超出 `^` 约束,需手动修改版本号。
|
|
203
|
+
只想升 ui-dev-server 本身、不在意它带的依赖时,直接 `npm i @bams-app/ui-dev-server@latest`。
|
|
204
|
+
跨大版本(0.1 → 0.2)先改 `package.json` 为 `"^0.2.0"`,再执行上面的两步。
|
|
203
205
|
|
|
204
206
|
### 前提
|
|
205
207
|
|
|
@@ -208,24 +210,6 @@ bams-work update
|
|
|
208
210
|
(registry.npmjs.org);仅在内网隔离、必须走私服时,才在项目 `.npmrc` 手动加
|
|
209
211
|
`@bams-app:registry=https://npm.hedpy.cn/`(私服若存在同名旧版本,会遮蔽官方新版)。
|
|
210
212
|
|
|
211
|
-
## 本地验证(未发布时)
|
|
212
|
-
|
|
213
|
-
未发布时通过 `file:` 引用本地 work 包完成端到端验证(`create` 会自动探测 work 仓库根,
|
|
214
|
-
将 ui-dev-server 与能力包以 `file:` 注入项目依赖,无需手动设置环境变量)。
|
|
215
|
-
注意:本地验证模式需自行在项目根创建 `.npmrc` 并写入 `install-links=true`,使 `file:` 包以
|
|
216
|
-
复制方式安装并解析其全部传递依赖;修改 work 包源码后需重新执行 `npm install` 才会生效:
|
|
217
|
-
|
|
218
|
-
```bash
|
|
219
|
-
yarn install # 在仓库根安装(yarn workspaces 链接 work/ 下的本地包)
|
|
220
|
-
cd work/cli && npm link # 全局链接 bams-work
|
|
221
|
-
|
|
222
|
-
cd /tmp && rm -rf demo-app
|
|
223
|
-
bams-work create demo-app # 自动以 file: 引用本地 ui-dev-server 与能力包
|
|
224
|
-
cd demo-app && npm install
|
|
225
|
-
bams-work dev demo # 应返回 HTTP 200
|
|
226
|
-
bams-work add --dir energy-ui --name ui-order-list
|
|
227
|
-
```
|
|
228
|
-
|
|
229
213
|
## 环境要求
|
|
230
214
|
|
|
231
215
|
- Node.js >= 16.7.0
|
package/bin/work-cli.js
CHANGED
|
@@ -9,20 +9,19 @@ const pkg = require('../package.json');
|
|
|
9
9
|
const COMMANDS = {
|
|
10
10
|
create: '初始化 Monorepo 项目模版',
|
|
11
11
|
add: '在 scope 目录下创建组件(component/page/base)',
|
|
12
|
-
dev: '启动 work 开发环境(serve,复用 ui-dev-server)',
|
|
13
12
|
env: '创建开发环境配置(.envs/.env.dev-<alias>)',
|
|
14
|
-
update: '升级 @bams-app 包(更新 ui-dev-server 并重装依赖)',
|
|
15
13
|
'pages-entry': '扫描 page-*/ui-* 目录生成 webpack 动态入口',
|
|
16
14
|
'pages-from-components': '批量将 ui-* 组件转为 page-* 页面'
|
|
17
15
|
};
|
|
18
16
|
|
|
19
17
|
// 暂时下线的命令:commands/ 下的实现文件保留,恢复时删除此处对应项即可
|
|
20
|
-
|
|
18
|
+
// dev:开发环境由用户项目本地的 ui-dev-server 启动(npm run dev:ui),CLI 不再承担
|
|
19
|
+
const DISABLED_COMMANDS = ['dev', 'build', 'umd'];
|
|
21
20
|
|
|
22
21
|
function printUsage() {
|
|
23
22
|
console.log('');
|
|
24
23
|
console.log(colorize('BAMS-Work CLI', 'cyan'), colorize(`v${pkg.version}`, 'gray'));
|
|
25
|
-
console.log(colorize('复用 work 已发布的包(
|
|
24
|
+
console.log(colorize('复用 work 已发布的包(create-env / create-ui-*)', 'gray'));
|
|
26
25
|
console.log('');
|
|
27
26
|
console.log(colorize('用法:', 'bold'));
|
|
28
27
|
console.log(' bams-work <command> [options]');
|
|
@@ -35,12 +34,13 @@ function printUsage() {
|
|
|
35
34
|
console.log(colorize('示例:', 'bold'));
|
|
36
35
|
console.log(' bams-work create my-bams-project # 初始化 Monorepo 项目');
|
|
37
36
|
console.log(' bams-work add --dir energy-ui --name ui-order-list');
|
|
38
|
-
console.log(' bams-work dev demo ui-component-demo # 启动 work 开发环境');
|
|
39
37
|
console.log(' bams-work env # 创建开发环境配置(交互式)');
|
|
40
|
-
console.log(' bams-work update # 升级 @bams-app 包');
|
|
41
38
|
console.log(' bams-work pages-entry --dir energy-ui --type page');
|
|
42
39
|
console.log(' bams-work pages-from-components --dir energy-ui');
|
|
43
40
|
console.log('');
|
|
41
|
+
console.log(colorize('开发调试:', 'bold'));
|
|
42
|
+
console.log(' 在项目根目录执行 npm run dev:ui <环境标识>(由项目本地 ui-dev-server 启动并加载 .envs/ 环境文件)');
|
|
43
|
+
console.log('');
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
async function main() {
|
package/commands/add.js
CHANGED
|
@@ -131,7 +131,7 @@ async function main(args) {
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
success(`组件创建成功: ${toKebabCase(params.name)}(scope: ${scopeDir})`);
|
|
134
|
-
info(`开发:
|
|
134
|
+
info(`开发: npm run dev:ui <环境标识> -c ${toKebabCase(params.name)}`);
|
|
135
135
|
// UMD 命令暂时下线,恢复后取消注释
|
|
136
136
|
// info(`UMD: bams-work umd ${toKebabCase(params.name)}`);
|
|
137
137
|
}
|
package/commands/create.js
CHANGED
|
@@ -1,80 +1,12 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const { spawn } = require('child_process');
|
|
4
|
-
const { copyDir, exists, isDirectory, toKebabCase, error, success, info, log } = require('../lib/utils');
|
|
4
|
+
const { copyDir, exists, isDirectory, readJson, writeJson, toKebabCase, error, success, info, log } = require('../lib/utils');
|
|
5
5
|
|
|
6
6
|
const WORK_CLI_ROOT = path.resolve(__dirname, '../');
|
|
7
7
|
const TEMPLATES_DIR = path.join(WORK_CLI_ROOT, 'templates');
|
|
8
8
|
const PROJECT_TEMPLATE_DIR = path.join(TEMPLATES_DIR, 'project');
|
|
9
9
|
|
|
10
|
-
/**
|
|
11
|
-
* 探测 work 仓库根目录(本地验证模式定位 file: 引用来源)
|
|
12
|
-
* 1. WORK_PROJECT_ROOT 环境变量优先
|
|
13
|
-
* 2. 通过 file: 安装的 @bams-app/ui-dev-server 包真实路径上溯(ui-dev-server -> tooling -> work -> 仓库根)
|
|
14
|
-
* 3. 均不可用(registry 安装)时返回空,走发布模式
|
|
15
|
-
* @returns {string} work 仓库根目录或空字符串
|
|
16
|
-
*/
|
|
17
|
-
function detectWorkRoot() {
|
|
18
|
-
if (process.env.WORK_PROJECT_ROOT) {
|
|
19
|
-
return process.env.WORK_PROJECT_ROOT;
|
|
20
|
-
}
|
|
21
|
-
try {
|
|
22
|
-
const pkgPath = require.resolve('@bams-app/ui-dev-server/package.json');
|
|
23
|
-
const candidate = path.resolve(path.dirname(pkgPath), '../../..');
|
|
24
|
-
if (isDirectory(path.join(candidate, 'work', 'packages'))) {
|
|
25
|
-
return candidate;
|
|
26
|
-
}
|
|
27
|
-
} catch (e) {
|
|
28
|
-
// 忽略探测失败,回退发布模式
|
|
29
|
-
}
|
|
30
|
-
return '';
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* 生成 ui-dev-server 依赖声明
|
|
35
|
-
* - 本地验证模式(探测到 work 仓库)使用 file: 引用 work 仓库本地包
|
|
36
|
-
* - 否则使用 registry 版本号(发布后模式)
|
|
37
|
-
*/
|
|
38
|
-
function buildUiDevServerDep() {
|
|
39
|
-
const workRoot = detectWorkRoot();
|
|
40
|
-
if (workRoot) {
|
|
41
|
-
const pkgDir = path.join(workRoot, 'work', 'tooling', 'ui-dev-server');
|
|
42
|
-
if (isDirectory(pkgDir)) {
|
|
43
|
-
return `"@bams-app/ui-dev-server": "file:${pkgDir}"`;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return `"@bams-app/ui-dev-server": "*"`;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* 生成能力包依赖声明(单一来源:ui-dev-server 的 dependencies 中 @bams-app/*)
|
|
51
|
-
* - 本地验证模式(探测到 work 仓库)使用 file: 引用 work 仓库本地包(覆盖未发布包)
|
|
52
|
-
* - 发布后模式沿用 ui-dev-server 声明的版本范围,保证与 ui-dev-server 的传递依赖同源,
|
|
53
|
-
* 安装时解析为同一份,避免同一能力包出现两个版本
|
|
54
|
-
*/
|
|
55
|
-
function buildCapabilityDeps() {
|
|
56
|
-
const workRoot = detectWorkRoot();
|
|
57
|
-
const uiDevServerPkg = require(require.resolve('@bams-app/ui-dev-server/package.json'));
|
|
58
|
-
return Object.entries(uiDevServerPkg.dependencies || {})
|
|
59
|
-
.filter(([name]) => name.startsWith('@bams-app/'))
|
|
60
|
-
.map(([name, range]) => {
|
|
61
|
-
if (!workRoot) {
|
|
62
|
-
return `,\n "${name}": "${range}"`;
|
|
63
|
-
}
|
|
64
|
-
const short = name.replace('@bams-app/', '');
|
|
65
|
-
// 在 work/configs、work/packages、work/ui、work/tooling 多个位置依次查找包目录
|
|
66
|
-
const pkgDir = short === 'configs' && isDirectory(path.join(workRoot, 'work', 'configs'))
|
|
67
|
-
? path.join(workRoot, 'work', 'configs')
|
|
68
|
-
: [
|
|
69
|
-
path.join(workRoot, 'work', 'packages', short),
|
|
70
|
-
path.join(workRoot, 'work', 'ui', short),
|
|
71
|
-
path.join(workRoot, 'work', 'tooling', short)
|
|
72
|
-
].find(dir => isDirectory(dir));
|
|
73
|
-
return `,\n "${name}": "file:${pkgDir}"`;
|
|
74
|
-
})
|
|
75
|
-
.join('');
|
|
76
|
-
}
|
|
77
|
-
|
|
78
10
|
/**
|
|
79
11
|
* 委托 @bams-app/create-ui-component 创建示例组件(复用 work 的模板与命令)
|
|
80
12
|
*/
|
|
@@ -159,13 +91,11 @@ async function main(args) {
|
|
|
159
91
|
'utf8'
|
|
160
92
|
);
|
|
161
93
|
|
|
162
|
-
// 3.
|
|
94
|
+
// 3. 生成项目 package.json:替换项目名
|
|
163
95
|
const projectPackageJson = path.join(targetDir, 'package.json');
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
.split('__CAPABILITY_DEPS__').join(buildCapabilityDeps());
|
|
168
|
-
fs.writeFileSync(projectPackageJson, pkgContent, 'utf8');
|
|
96
|
+
const projectPkg = readJson(projectPackageJson);
|
|
97
|
+
projectPkg.name = projectName;
|
|
98
|
+
writeJson(projectPackageJson, projectPkg);
|
|
169
99
|
|
|
170
100
|
// 4. 创建示例组件(复用 work 的 create-ui-component 模板与命令)
|
|
171
101
|
const demoCode = await createDemoComponent(targetDir);
|
|
@@ -181,8 +111,9 @@ async function main(args) {
|
|
|
181
111
|
log(` cd ${projectName}`);
|
|
182
112
|
log(' npm install # 或 yarn install(ui-dev-server 与能力包将安装到根 node_modules)');
|
|
183
113
|
log('');
|
|
184
|
-
log('
|
|
185
|
-
log(
|
|
114
|
+
log('启动开发环境(项目本地 ui-dev-server,环境标识用位置参数传入):');
|
|
115
|
+
log(' npm run dev:ui demo # 加载 .envs/.env.dev-demo + ui-component-demo');
|
|
116
|
+
log(' npm run dev:ui demo ui-component-demo # 指定组件(换环境改第 1 个参数)');
|
|
186
117
|
log('');
|
|
187
118
|
log('创建新组件:');
|
|
188
119
|
log(' bams-work add --dir energy-ui --name ui-order-list');
|
package/commands/dev.js
CHANGED
|
@@ -5,6 +5,10 @@ const { findProjectRoot, error, info, run } = require('../lib/utils');
|
|
|
5
5
|
/**
|
|
6
6
|
* 用法: bams-work dev <env> [component] [--layout pc|touch] [-- <vue-cli args>]
|
|
7
7
|
* 委托 @bams-app/shared-env 加载环境变量,并启动 @bams-app/ui-dev-server 开发服务
|
|
8
|
+
*
|
|
9
|
+
* 已暂时下线(入口 COMMANDS 与 DISABLED_COMMANDS 见 bin/work-cli.js):
|
|
10
|
+
* 开发环境改由用户项目本地承担(模板 package.json 的 dev:ui 脚本 + npm run dev:ui),
|
|
11
|
+
* 全局 CLI 不再依赖 ui-dev-server / shared-env;如需恢复本命令,需同时恢复这两个依赖。
|
|
8
12
|
*/
|
|
9
13
|
async function main(args) {
|
|
10
14
|
const projectRoot = findProjectRoot(process.cwd());
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bams-app/work-cli",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "BAMS-Work 全局开发工具:复用 work 已发布的包(
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "BAMS-Work 全局开发工具:复用 work 已发布的包(create-env / create-ui-*)提供项目初始化、组件创建与环境配置能力,开发调试由用户项目本地的 ui-dev-server 承担",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"bams-work": "./bin/work-cli.js"
|
|
@@ -18,9 +18,7 @@
|
|
|
18
18
|
"@bams-app/create-pages-from-components": "*",
|
|
19
19
|
"@bams-app/create-ui-base": "*",
|
|
20
20
|
"@bams-app/create-ui-component": "*",
|
|
21
|
-
"@bams-app/create-ui-page": "*"
|
|
22
|
-
"@bams-app/shared-env": "*",
|
|
23
|
-
"@bams-app/ui-dev-server": "*"
|
|
21
|
+
"@bams-app/create-ui-page": "*"
|
|
24
22
|
},
|
|
25
23
|
"engines": {
|
|
26
24
|
"node": ">=16.7.0"
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* BAMS-Work 自定义开发代理(可选)
|
|
3
|
-
*
|
|
3
|
+
* 存在本文件(去掉 .example 后缀)时由 ui-dev-server 自动加载。
|
|
4
|
+
*
|
|
5
|
+
* 优先级(同名前缀由前者覆盖后者):
|
|
6
|
+
* 1. 本文件 proxy 中声明的前缀
|
|
7
|
+
* 2. 内置默认前缀 /bams-assets、/bams-ui-umd、/bams-app、/admin-api、/preview
|
|
8
|
+
* (target 取环境文件中的 PROXY_TARGET,仅补充本文件未声明的前缀)
|
|
9
|
+
*
|
|
10
|
+
* 键序即匹配序:webpack-dev-server 按声明顺序匹配,精确 path 请写在前面。
|
|
11
|
+
* 修改后需重启开发服务(npm run dev:ui)才生效。
|
|
12
|
+
*
|
|
4
13
|
* 也可导出函数:module.exports = ({ env, projectRoot }) => ({ proxy: { ... } })
|
|
5
14
|
*/
|
|
6
15
|
module.exports = {
|
|
@@ -19,40 +19,48 @@
|
|
|
19
19
|
## 快速开始
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npm install # 安装依赖到根 node_modules
|
|
23
|
-
|
|
22
|
+
npm install # 安装依赖到根 node_modules(含项目本地的 ui-dev-server)
|
|
23
|
+
npm run dev:ui demo # 启动开发环境(环境标识 demo → .envs/.env.dev-demo,示例端口 8700)
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
>
|
|
27
|
-
>
|
|
26
|
+
> 开发调试由**项目本地**的 `@bams-app/ui-dev-server` 启动(`npm run dev:ui <环境标识>`),
|
|
27
|
+
> 环境标识作为位置参数传入(`demo` → `.envs/.env.dev-demo`)。
|
|
28
|
+
> 其余 `bams-work` 命令都在**项目根目录**(含 `.bams-work/` 的目录)执行。
|
|
29
|
+
> 全局帮助 `bams-work --help`,版本 `bams-work --version`。
|
|
28
30
|
|
|
29
31
|
## 命令一览
|
|
30
32
|
|
|
31
33
|
| 命令 | 作用 |
|
|
32
34
|
| ---------------------------------------------------- | --------------------------- |
|
|
33
|
-
| `dev
|
|
35
|
+
| `npm run dev:ui <环境标识>` | 启动开发服务(最常用) |
|
|
34
36
|
| `add --dir <scope> --name <name>` | 新建组件 / 页面 / 基础组件 |
|
|
35
37
|
| `env` | 交互式创建开发环境配置 |
|
|
36
|
-
| `update` | 升级 `@bams-app` 依赖 |
|
|
37
38
|
| `pages-entry --dir <scope> --type <page\|component>` | 生成 webpack 动态入口 |
|
|
38
39
|
| `pages-from-components --dir <scope>` | 批量将 `ui-*` 转为 `page-*` |
|
|
39
40
|
|
|
40
|
-
### 1. `
|
|
41
|
+
### 1. `npm run dev:ui <环境标识>` — 启动开发环境
|
|
42
|
+
|
|
43
|
+
`dev:ui` 即项目本地的 `ui-dev-server`,**环境标识用位置参数指定(不加 `--` 分隔符)**,
|
|
44
|
+
追加的位置参数会覆盖默认值:
|
|
41
45
|
|
|
42
46
|
```bash
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
npm run dev:ui demo # 加载 .envs/.env.dev-demo + 默认组件 ui-component-demo
|
|
48
|
+
npm run dev:ui demo ui-order-list # 指定要调试的组件
|
|
49
|
+
npm run dev:ui test # 换环境:加载 .envs/.env.dev-test
|
|
50
|
+
npm run dev:ui demo ui-order-list -l touch # 切换布局(默认 pc)
|
|
51
|
+
npm run dev:ui demo ui-order-list -- --port 8080 # `--` 之后的参数透传给 vue-cli-service
|
|
47
52
|
```
|
|
48
53
|
|
|
49
|
-
| 参数 | 必填 | 说明
|
|
50
|
-
| ------------------- | ---- |
|
|
51
|
-
|
|
|
52
|
-
|
|
|
53
|
-
| `--
|
|
54
|
-
| `--component`、`-c` | 否 | 等价于位置参数
|
|
55
|
-
|
|
|
54
|
+
| 参数 | 必填 | 说明 |
|
|
55
|
+
| ------------------- | ---- | ------------------------------------------------------------------ |
|
|
56
|
+
| 位置参数 1 | 是 | 环境标识(如 `demo` → `.envs/.env.dev-demo`),也可传 env 文件路径 |
|
|
57
|
+
| 位置参数 2 | 否 | 组件目录名(如 `ui-order-list`),省略时默认 `ui-component-demo` |
|
|
58
|
+
| `--env`、`-e` | 否 | 等价于位置参数 1(显式指定环境标识或 env 文件路径) |
|
|
59
|
+
| `--component`、`-c` | 否 | 等价于位置参数 2 |
|
|
60
|
+
| `--layout`、`-l` | 否 | 布局:`pc`(默认)/ `touch` |
|
|
61
|
+
| `--` 之后的参数 | 否 | 原样透传给底层 `vue-cli-service`(如 `--port`、`--open`) |
|
|
62
|
+
|
|
63
|
+
环境文件不存在时直接报错并给出路径,不会静默使用默认值。
|
|
56
64
|
|
|
57
65
|
启动地址与接口代理取自环境文件:`PORT` 决定本地端口,`PROXY_TARGET` 决定后端代理目标。
|
|
58
66
|
|
|
@@ -71,7 +79,7 @@ bams-work add --dir demo-ui --name ui-base-btn --type base # 基础组件
|
|
|
71
79
|
| `--type` | 否 | `component`(默认)/ `page` / `base` |
|
|
72
80
|
| `--desc` | 否 | 组件描述 |
|
|
73
81
|
|
|
74
|
-
创建完成后会提示用哪条 `dev` 命令调试。
|
|
82
|
+
创建完成后会提示用哪条 `npm run dev:ui` 命令调试。
|
|
75
83
|
|
|
76
84
|
### 3. `bams-work env` — 创建开发环境
|
|
77
85
|
|
|
@@ -88,7 +96,7 @@ bams-work env
|
|
|
88
96
|
- **快速复制**:基于现有环境文件,或 `production` 空值模板,只改差异项(推荐)
|
|
89
97
|
- **自定义配置**:从默认模板逐项填写
|
|
90
98
|
|
|
91
|
-
环境标识即 `dev`
|
|
99
|
+
环境标识即 `npm run dev:ui` 的第 1 个位置参数:`bams-work env` 创建了 `test`,就用 `npm run dev:ui test` 启动。
|
|
92
100
|
|
|
93
101
|
常用字段(可直接编辑对应环境文件,`dev` 每次启动都会重新加载):
|
|
94
102
|
|
|
@@ -106,12 +114,41 @@ bams-work env
|
|
|
106
114
|
| `VUE_APP_LOGIN_URL`、`VUE_APP_LOGIN_PUBLIC_KEY`、`VUE_APP_WEBSOCKET_URL` | 登录页地址、登录公钥、WebSocket 地址 |
|
|
107
115
|
| `VUE_APP_DEVEXTREME_LICENSE_KEY` | DevExtreme 许可证密钥(可留空) |
|
|
108
116
|
|
|
109
|
-
### 4.
|
|
117
|
+
### 4. 升级 ui-dev-server 提供的依赖
|
|
118
|
+
|
|
119
|
+
能力包与运行时依赖(vue、ant-design-vue、devextreme 等)由 ui-dev-server 提供,不在项目
|
|
120
|
+
`package.json` 中声明;lockfile 已把它们逐个钉死,所以 `npm install`、
|
|
121
|
+
`npm i @bams-app/ui-dev-server@latest`、`npm update @bams-app/ui-dev-server` 都**不会**刷新
|
|
122
|
+
它们(只换掉 ui-dev-server 自己),裸 `npm update` 又会重解析整棵依赖树。
|
|
123
|
+
|
|
124
|
+
清掉 lockfile 中这些包的记录,再让 npm 按 ui-dev-server 的声明重新解析:
|
|
110
125
|
|
|
111
126
|
```bash
|
|
112
|
-
|
|
127
|
+
# 1. 按 ui-dev-server 的依赖清单清理 package-lock.json
|
|
128
|
+
node -e "
|
|
129
|
+
const fs = require('fs');
|
|
130
|
+
const dev = JSON.parse(fs.readFileSync('node_modules/@bams-app/ui-dev-server/package.json', 'utf8'));
|
|
131
|
+
const names = new Set([...Object.keys(dev.dependencies || {}), '@bams-app/ui-dev-server']);
|
|
132
|
+
const lock = JSON.parse(fs.readFileSync('package-lock.json', 'utf8'));
|
|
133
|
+
let removed = 0;
|
|
134
|
+
for (const section of ['packages', 'dependencies']) {
|
|
135
|
+
const container = lock[section];
|
|
136
|
+
if (!container) continue;
|
|
137
|
+
for (const key of Object.keys(container)) {
|
|
138
|
+
const name = key.replace(/^.*node_modules\//, '');
|
|
139
|
+
if (names.has(name)) { delete container[key]; removed++; }
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
fs.writeFileSync('package-lock.json', JSON.stringify(lock, null, 2) + '\n');
|
|
143
|
+
console.log('已清理', removed, '条由 ui-dev-server 提供的依赖记录');
|
|
144
|
+
"
|
|
145
|
+
|
|
146
|
+
# 2. 这些包按 ui-dev-server 声明的版本重新解析,其余依赖保持锁定不动
|
|
147
|
+
npm install
|
|
113
148
|
```
|
|
114
149
|
|
|
150
|
+
只想升 ui-dev-server 本身、不在意它带的依赖时,直接 `npm i @bams-app/ui-dev-server@latest`。
|
|
151
|
+
|
|
115
152
|
### 5. 其他命令
|
|
116
153
|
|
|
117
154
|
- `bams-work pages-entry --dir <scope> --type page|component`:扫描该 scope 下的 `page-*` / `ui-*` 目录,生成 webpack 动态入口 `build-components-entry.js`(构建流程内部使用,一般无需手动执行)
|
|
@@ -121,13 +158,12 @@ bams-work update # 升级并重装依赖
|
|
|
121
158
|
|
|
122
159
|
```bash
|
|
123
160
|
npm install
|
|
124
|
-
# 或
|
|
125
|
-
yarn install
|
|
126
161
|
```
|
|
127
162
|
|
|
128
|
-
`@bams-app/ui-dev-server`
|
|
129
|
-
|
|
130
|
-
|
|
163
|
+
项目只声明 `@bams-app/ui-dev-server` 一个开发依赖,能力包(`@bams-app/components` 等)与
|
|
164
|
+
运行时依赖(vue、ant-design-vue、devextreme、pinia、axios、dayjs 等)都由它提供,
|
|
165
|
+
安装后提升到项目根 `node_modules`,业务组件与开发环境共用同一份实例。升级这些依赖只需
|
|
166
|
+
更新 ui-dev-server(见上文),无需逐个改版本号。
|
|
131
167
|
|
|
132
168
|
## 升级 CLI
|
|
133
169
|
|
|
@@ -135,10 +171,12 @@ yarn install
|
|
|
135
171
|
npm i -g @bams-app/work-cli@latest
|
|
136
172
|
```
|
|
137
173
|
|
|
138
|
-
|
|
139
|
-
|
|
174
|
+
全局 CLI 只负责创建项目、组件与环境配置,开发调试由项目本地的 `npm run dev:ui` 承担;
|
|
175
|
+
项目依赖按上文「升级 ui-dev-server 提供的依赖」清理 lockfile 后升级。
|
|
140
176
|
|
|
141
177
|
## 自定义配置
|
|
142
178
|
|
|
143
|
-
- 代理:创建项目根 `.proxy.js`(见 `.proxy.js.example
|
|
179
|
+
- 代理:创建项目根 `.proxy.js`(见 `.proxy.js.example`)。其中声明的前缀优先于内置默认前缀
|
|
180
|
+
(`/bams-assets`、`/bams-ui-umd`、`/bams-app`、`/admin-api`、`/preview`,target 取环境文件中的
|
|
181
|
+
`PROXY_TARGET`),内置默认仅补充未声明项;键序即匹配序,修改后需重启 `npm run dev:ui`
|
|
144
182
|
- webpack 扩展:创建项目根 `vue.config.extend.js`(导出对象或 `({ env, projectRoot }) => 对象`)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
2
|
+
"name": "bams-work-project",
|
|
3
3
|
"version": "0.0.6",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "BAMS-Work Monorepo 项目",
|
|
@@ -11,26 +11,10 @@
|
|
|
11
11
|
"bams-ui"
|
|
12
12
|
],
|
|
13
13
|
"scripts": {
|
|
14
|
-
"dev": "
|
|
14
|
+
"dev:ui": "ui-dev-server",
|
|
15
15
|
"add": "bams-work add"
|
|
16
16
|
},
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
"@ant-design/icons-vue": "^7.0.1",
|
|
20
|
-
"ant-design-vue": "4.2.6",
|
|
21
|
-
"axios": "^1.13.2",
|
|
22
|
-
"core-js": "^3.8.3",
|
|
23
|
-
"dayjs": "^1.11.20",
|
|
24
|
-
"devextreme": "25.2.3",
|
|
25
|
-
"devextreme-exceljs-fork": "^4.4.8",
|
|
26
|
-
"devextreme-vue": "25.2.3",
|
|
27
|
-
"file-saver": "^2.0.5",
|
|
28
|
-
"flex.css": "^1.1.7",
|
|
29
|
-
"jsencrypt": "^3.5.4",
|
|
30
|
-
"marked": "^17.0.4",
|
|
31
|
-
"pinia": "^3.0.4",
|
|
32
|
-
"pinia-plugin-persistedstate": "^4.7.1",
|
|
33
|
-
"vue": "^3.5.24",
|
|
34
|
-
"vue-router": "4"
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@bams-app/ui-dev-server": "*"
|
|
35
19
|
}
|
|
36
20
|
}
|
package/commands/update.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
const { execSync } = require('child_process');
|
|
4
|
-
const { findProjectRoot, readJson, writeJson, run, error, warn, success, info, log } = require('../lib/utils');
|
|
5
|
-
|
|
6
|
-
const UI_DEV_SERVER = '@bams-app/ui-dev-server';
|
|
7
|
-
|
|
8
|
-
// 解析版本范围中声明的基础版本(如 ^0.1.0 -> 0.1.0)
|
|
9
|
-
function parseRangeVersion(range) {
|
|
10
|
-
if (!range) return null;
|
|
11
|
-
const match = String(range)
|
|
12
|
-
.replace(/^[~^]/, '')
|
|
13
|
-
.match(/(\d+)\.(\d+)\.(\d+)/);
|
|
14
|
-
return match ? `${match[1]}.${match[2]}.${match[3]}` : null;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// 简单三段的版本比较:a > b 返回 1,相等 0,小于 -1
|
|
18
|
-
function compareVersions(a, b) {
|
|
19
|
-
const pa = a.split('.').map(Number);
|
|
20
|
-
const pb = b.split('.').map(Number);
|
|
21
|
-
for (let i = 0; i < 3; i++) {
|
|
22
|
-
if ((pa[i] || 0) > (pb[i] || 0)) return 1;
|
|
23
|
-
if ((pa[i] || 0) < (pb[i] || 0)) return -1;
|
|
24
|
-
}
|
|
25
|
-
return 0;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// 查询 registry 上的最新版本(继承项目 .npmrc 的 @bams-app:registry 配置)
|
|
29
|
-
function fetchLatestVersion(projectRoot) {
|
|
30
|
-
try {
|
|
31
|
-
const output = execSync(`npm view ${UI_DEV_SERVER} version --no-audit --no-fund`, {
|
|
32
|
-
cwd: projectRoot,
|
|
33
|
-
encoding: 'utf8',
|
|
34
|
-
stdio: ['ignore', 'pipe', 'ignore']
|
|
35
|
-
});
|
|
36
|
-
return String(output).trim() || null;
|
|
37
|
-
} catch (e) {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async function main(args) {
|
|
43
|
-
const skipInstall = args.includes('--skip-install');
|
|
44
|
-
const projectRoot = findProjectRoot();
|
|
45
|
-
if (!projectRoot) {
|
|
46
|
-
error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请在用户项目根目录执行');
|
|
47
|
-
process.exit(1);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const pkgPath = path.join(projectRoot, 'package.json');
|
|
51
|
-
const pkg = readJson(pkgPath);
|
|
52
|
-
const declared = (pkg.dependencies || {})[UI_DEV_SERVER];
|
|
53
|
-
|
|
54
|
-
if (!declared) {
|
|
55
|
-
warn(`未在 package.json 中找到 ${UI_DEV_SERVER} 依赖`);
|
|
56
|
-
process.exit(0);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// 本地验证模式:file: 引用,升级 = 清除缓存 + 重装以同步 work 最新源码
|
|
60
|
-
if (declared.startsWith('file:')) {
|
|
61
|
-
if (skipInstall) {
|
|
62
|
-
warn('本地验证模式需重装才能同步源码,忽略 --skip-install');
|
|
63
|
-
}
|
|
64
|
-
info(`当前为本地验证模式(${declared})`);
|
|
65
|
-
// npm 对已安装的 file: 依赖会直接跳过(即使源码已变化),
|
|
66
|
-
// 需先清除 node_modules 中的安装缓存,再重装强制重新复制
|
|
67
|
-
const fileDeps = Object.entries(pkg.dependencies || {})
|
|
68
|
-
.filter(([, v]) => typeof v === 'string' && v.startsWith('file:'))
|
|
69
|
-
.map(([name]) => name);
|
|
70
|
-
let removed = 0;
|
|
71
|
-
for (const name of fileDeps) {
|
|
72
|
-
const target = path.join(projectRoot, 'node_modules', name);
|
|
73
|
-
try {
|
|
74
|
-
if (fs.lstatSync(target)) {
|
|
75
|
-
fs.rmSync(target, { recursive: true, force: true });
|
|
76
|
-
removed++;
|
|
77
|
-
}
|
|
78
|
-
} catch (e) {
|
|
79
|
-
// 目标不存在,跳过
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
info(`已清除 ${removed} 个 file: 依赖缓存,将重新同步 work 源码`);
|
|
83
|
-
} else {
|
|
84
|
-
// 发布后模式:查询 registry 最新版本并升级声明
|
|
85
|
-
const current = parseRangeVersion(declared);
|
|
86
|
-
const latest = fetchLatestVersion(projectRoot);
|
|
87
|
-
if (!latest) {
|
|
88
|
-
warn(`查询 ${UI_DEV_SERVER} 最新版本失败(请检查项目 .npmrc 的 @bams-app:registry 配置与网络)`);
|
|
89
|
-
} else if (current && compareVersions(latest, current) > 0) {
|
|
90
|
-
info(`发现新版本: ${current} -> ${latest}`);
|
|
91
|
-
pkg.dependencies[UI_DEV_SERVER] = `^${latest}`;
|
|
92
|
-
writeJson(pkgPath, pkg);
|
|
93
|
-
success(`已更新 ${UI_DEV_SERVER} 为 ^${latest}`);
|
|
94
|
-
} else {
|
|
95
|
-
info(`${UI_DEV_SERVER} 已是最新版本(${latest})`);
|
|
96
|
-
}
|
|
97
|
-
if (skipInstall) {
|
|
98
|
-
info('已跳过依赖安装(--skip-install),请手动执行 npm install');
|
|
99
|
-
process.exit(0);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
log('正在重新安装依赖(能力包为 * 范围,将自动对齐最新版)...');
|
|
104
|
-
const code = await run('npm', ['install'], { cwd: projectRoot });
|
|
105
|
-
if (code !== 0) {
|
|
106
|
-
error('依赖安装失败');
|
|
107
|
-
process.exit(code);
|
|
108
|
-
}
|
|
109
|
-
success('升级完成');
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
module.exports = main;
|
|
113
|
-
|
|
114
|
-
if (require.main === module) {
|
|
115
|
-
main(process.argv.slice(2)).catch((err) => {
|
|
116
|
-
error(err.message || err);
|
|
117
|
-
process.exit(1);
|
|
118
|
-
});
|
|
119
|
-
}
|