@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 CHANGED
@@ -1,35 +1,35 @@
1
1
  # @bams-app/work-cli
2
2
 
3
- BAMS-Work 全局开发工具(类似 vue-cli 模式),提供**项目初始化**与**组件开发命令**。
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
- | 开发服务 / 构建 | `@bams-app/ui-dev-server`(serve / build-app / build-umd) |
14
- | 环境变量加载 | `@bams-app/shared-env` |
15
- | 环境配置创建 | `@bams-app/create-env`(交互式生成 `.envs/.env.dev-<alias>`) |
16
- | 动态入口生成 | `@bams-app/create-pages-entry`(扫描 page-*/ui-* 生成 build-components-entry.js) |
17
- | 批量页面创建 | `@bams-app/create-pages-from-components`(批量将 ui-* 转为 page-*,复用 create-ui-page) |
18
- | 公共配置 | `@bams-app/configs`(app-config.json、可配置组件插槽默认值,被 ui-dev-server 与 store 依赖) |
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` 只声明 `@bams-app/ui-dev-server` 与能力包,**不声明任何外部运行时依赖**;
25
- 发布后模式下能力包的传递依赖(vue、ant-design-vue 等)由 npm 自动安装。`create` **不生成**
26
- 项目 `.npmrc`;仅本地验证模式(`file:` 引用 work 本地包)需手动在项目根创建 `.npmrc` 并写入
27
- `install-links=true`,否则 npm 只对 `file:` 包建符号链接、不安装其传递依赖。
28
- - 能力包(`work/packages`、`work/ui`、`work/configs` 下的全部运行时包,含 ui 组件)声明
29
- **以 ui-dev-server dependencies 为单一来源**:本地验证模式逐个 `file:` 注入 work 本地
30
- 目录,发布后模式由 ui-dev-server 的 dependencies 随 npm 自动安装,业务组件与 runtime
31
- 共用同一份根 node_modules。
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 / dev<br/>env / pages-entry / pages-from-components"]
46
+ D["create / add / env<br/>pages-entry / pages-from-components"]
47
47
  end
48
48
  subgraph PROJ["用户项目(Monorepo)"]
49
- E["package.json<br/>仅声明 @bams-app/*"]
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 -->|"发布后随 npm 自动安装"| PROJ
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
- # 启动 work 开发环境(加载 .envs/.env.dev-<env>)
88
- bams-work dev demo # 默认组件 ui-component-demo
89
- bams-work dev demo ui-order-list # 指定组件
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>` | 初始化 Monorepo 项目模版(含示例组件与 `.bams-work/` 标记) |
105
- | `add --dir <scope> --name <name>` | 在 scope 目录下创建组件(component/page/base),并注册 workspace |
106
- | `dev <env> [component]` | 启动 work 开发环境(复用 ui-dev-server serve |
107
- | `env` | 交互式创建开发环境配置 `.envs/.env.dev-<alias>`(复用 create-env) |
108
- | `update [--skip-install]` | 升级 `@bams-app` 包:查询最新版本、更新 ui-dev-server 声明并重装依赖 |
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>` 时由 `@bams-app/shared-env` 加载。
122
- - 代理:项目根 `.proxy.js`(参考 `.proxy.js.example`)。
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
- 能力包(`@bams-app/*`,含 `work/ui` 下的 ui 组件包)由 `ui-dev-server` 的 dependencies
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
- 用户项目依赖 `@bams-app/*` 的方式决定升级方式:本地验证模式为 `file:` 引用 work 本地包,
169
- 发布后模式仅直接依赖 `@bams-app/ui-dev-server`(`^0.0.1`),能力包由 ui-dev-server 的
170
- dependencies(`"*"`)传递安装。
171
-
172
- ### 一键升级(推荐)
163
+ 用户项目的 `devDependencies` 只声明 `@bams-app/ui-dev-server` 一个(`"*"`),能力包与
164
+ 运行时依赖全部作为它的传递依赖解析到同一份包,提升到项目根 `node_modules`。
173
165
 
174
- ```bash
175
- bams-work update
176
- ```
166
+ ### 为什么直接用 npm 命令带不动这些依赖
177
167
 
178
- 自动完成:本地 file: 模式清除 node_modules 中的 file: 依赖缓存后重装,强制同步 work 最新
179
- 源码;发布后模式查询 registry 最新版本 → 更新 `package.json` ui-dev-server 声明 →
180
- 重新 `npm install`(能力包 `*` 范围自动对齐最新)。`--skip-install` 可跳过重装。
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
- ### 本地验证模式(file:)
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
- bams-work update
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
- ### 发布后模式(registry)
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
- const DISABLED_COMMANDS = ['build', 'umd'];
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 已发布的包(ui-dev-server / shared-env / create-ui-*)', 'gray'));
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(`开发: bams-work dev <env> ${toKebabCase(params.name)}`);
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
  }
@@ -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. 替换项目 package.json 占位符
94
+ // 3. 生成项目 package.json:替换项目名
163
95
  const projectPackageJson = path.join(targetDir, 'package.json');
164
- const pkgContent = fs.readFileSync(projectPackageJson, 'utf8')
165
- .split('__PROJECT_NAME__').join(projectName)
166
- .split('__UI_DEV_SERVER_DEP__').join(buildUiDevServerDep())
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('启动 work 开发环境:');
185
- log(` bams-work dev demo ui-component-demo # 加载 .envs/.env.dev-demo`);
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.9",
4
- "description": "BAMS-Work 全局开发工具:复用 work 已发布的包(ui-dev-server / shared-env / create-ui-*)提供项目初始化与组件开发能力(类似 vue-cli)",
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
- bams-work dev demo # 启动开发环境(示例环境端口 8700)
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
- > 所有 `bams-work` 命令都在**项目根目录**执行(即含 `.bams-work/` 的目录)。
27
- > 全局帮助 `bams-work --help`,查看版本 `bams-work --version`。
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 <env> [component]` | 启动开发服务(最常用) |
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. `bams-work dev` — 启动开发环境
41
+ ### 1. `npm run dev:ui <环境标识>` — 启动开发环境
42
+
43
+ `dev:ui` 即项目本地的 `ui-dev-server`,**环境标识用位置参数指定(不加 `--` 分隔符)**,
44
+ 追加的位置参数会覆盖默认值:
41
45
 
42
46
  ```bash
43
- bams-work dev demo # 加载 .envs/.env.dev-demo,默认组件 ui-component-demo
44
- bams-work dev demo ui-order-list # 指定要调试的组件
45
- bams-work dev demo ui-order-list --layout touch # 切换布局(默认 pc)
46
- bams-work dev demo ui-order-list -- --port 8080 # `--` 之后的参数透传给 vue-cli-service
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
- | `<env>` | 是 | 环境标识,对应 `.envs/.env.dev-<env>`;文件不存在会直接报错,先用 `bams-work env` 创建 |
52
- | `[component]` | 否 | 组件目录名(如 `ui-order-list`),省略时默认 `ui-component-demo` |
53
- | `--layout`、`-l` | 否 | 布局:`pc`(默认)/ `touch` |
54
- | `--component`、`-c` | 否 | 等价于位置参数 `[component]` |
55
- | `--` 之后的参数 | 否 | 原样透传给底层 `vue-cli-service`(如 `--port`、`--open`) |
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` 的第一个参数:`bams-work env` 创建了 `test`,就用 `bams-work dev test` 启动。
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. `bams-work update` — 升级依赖
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
- bams-work update # 升级并重装依赖
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` 及其依赖的能力包(`@bams-app/components` 等)会安装到根 node_modules,
129
- 业务组件与 work 开发环境共用同一套能力实例;能力包的传递依赖(vue、ant-design-vue 等)由 npm
130
- 自动安装,因此 `package.json` 无需声明任何外部运行时依赖。
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
- 项目运行时依赖只有 `@bams-app/ui-dev-server`,其余能力包(`@bams-app/components` 等)由它传递安装,
139
- 升级项目依赖用 `bams-work update`(见上文)。
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 }) => 对象`)
@@ -6,9 +6,6 @@ dist/
6
6
  build/
7
7
  *.log
8
8
 
9
- # BAMS-Work 内部产物(install 时由 .bams-work 重新生成)
10
- .bams-work/
11
-
12
9
  # IDE
13
10
  .vscode/
14
11
  .idea/
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "__PROJECT_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": "bams-work dev",
14
+ "dev:ui": "ui-dev-server",
15
15
  "add": "bams-work add"
16
16
  },
17
- "dependencies": {
18
- __UI_DEV_SERVER_DEP____CAPABILITY_DEPS__,
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
  }
@@ -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
- }