@bams-app/work-cli 0.0.9 → 0.1.2

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 依赖) |
19
-
20
- - `create` 生成 **scope 目录模式** Monorepo:根 `workspaces: ["demo-ui/*", "bams-components/*", "*-ui/*", "apex-web/*", "bams-ui"]`,
21
- 业务组件按 scope 目录存放(`energy-ui/ui-xxx`)。
22
- - `workspaces` 与仓库根 `package.json` 保持一致:`bams-components/*`、`apex-web/*` 等 glob 用于兼容
23
- 用户克隆进项目的既有组件包仓库(目录不存在时不影响安装,`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` 环境变量注入项目根。
11
+ | 能力 | 来源包 |
12
+ | ------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
13
+ | 项目/组件创建 | `@bams-app/create-ui-component`、`@bams-app/create-ui-page`、`@bams-app/create-ui-base`(模板内置于各包 `templates/`) |
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 依赖) |
20
+
21
+ - `create` 生成 **scope 目录模式**项目:业务组件按 scope 目录存放(`energy-ui/ui-xxx`);
22
+ 项目根 `package.json` 声明 `demo-ui/*`、`bams-components/*`、`*-ui/*`、`apex-web/*`、`bams-ui`
23
+ 这些目录范围,用于兼容用户克隆进项目的既有组件包目录(目录不存在时不影响安装,
24
+ `create` 也不会默认创建它们)。
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
 
@@ -37,30 +37,31 @@ BAMS-Work 全局开发工具(类似 vue-cli 模式),提供**项目初始
37
37
  flowchart LR
38
38
  subgraph WORK["work 仓库(全部可发布包)"]
39
39
  A["能力包<br/>packages/ · ui/ · configs/"]
40
- B["开发工具与模板<br/>tooling/ · templates/"]
40
+ B["开发工具与模板<br/>tooling/"]
41
41
  end
42
42
  subgraph REG["私有 registry<br/>npm.hedpy.cn"]
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
- subgraph PROJ["用户项目(Monorepo)"]
49
- E["package.json<br/>仅声明 @bams-app/*"]
50
- F["npm install<br/>能力包及传递依赖自动安装"]
48
+ subgraph PROJ["用户项目"]
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
  ```
62
- 用户项目(Monorepo,scope 目录模式)
63
- ├── package.json # workspaces: demo-ui/*、bams-components/*、*-ui/*、apex-web/*、bams-ui
63
+ 用户项目(scope 目录模式)
64
+ ├── package.json # 项目根配置
64
65
  ├── .bams-work/ # BAMS-Work 项目标记目录(勿删除)
65
66
  ├── .envs/.env.dev-<env> # 环境变量
66
67
  ├── .proxy.js # 自定义代理(可选)
@@ -79,37 +80,30 @@ npm i -g @bams-app/work-cli
79
80
  ## 使用
80
81
 
81
82
  ```bash
82
- # 初始化 Monorepo 项目模版
83
- bams-work create my-bams-project
83
+ # 初始化项目模版
84
+ 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
- bams-work add --dir energy-ui --name ui-order-list
93
- bams-work add --dir energy-ui --name page-order-list --type page
94
- bams-work add --dir demo-ui --name ui-base-btn --type base
95
-
96
- # 升级 @bams-app 包(查询最新版并重装依赖)
97
- bams-work update
93
+ work add --dir energy-ui --name ui-order-list
94
+ work add --dir energy-ui --name page-order-list --type page
95
+ work add --dir demo-ui --name ui-base-btn --type base
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>` | 初始化项目模版(含示例组件与 `.bams-work/` 标记) |
103
+ | `add --dir <scope> --name <name>` | 在 scope 目录下创建组件(component/page/base),并注册 scope 目录 |
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 到空入口,保证编译不报错。
@@ -128,7 +126,7 @@ bams-work update
128
126
 
129
127
  所有 work 包统一发布到 npm registry,**默认官方 npm(registry.npmjs.org)**,通过环境变量
130
128
  `NPM_REGISTRY` 可随时切换到私有 registry(如 `https://npm.hedpy.cn/`)。work 下所有含
131
- `package.json` 的目录(`packages/`、`ui/`、`tooling/`、`templates/`、`cli/`、`configs/` 等)
129
+ `package.json` 的目录(`packages/`、`ui/`、`tooling/`、`cli/`、`configs/` 等)
132
130
  都会被打包发布,`private` 包自动跳过:
133
131
 
134
132
  ```bash
@@ -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
164
- workspaces 链接到本地包,发布后自动解析为 registry 上最新的已发布版本,无需手动改版本号。
158
+ `work-cli` `create` 生成的项目均以 `"*"` 声明 `@bams-app/ui-dev-server`:仓库内直接链接到
159
+ 本地包,发布后自动解析为 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
- ### 一键升级(推荐)
173
-
174
- ```bash
175
- bams-work update
176
- ```
163
+ 用户项目的 `devDependencies` 只声明 `@bams-app/ui-dev-server` 一个(`"*"`),能力包与
164
+ 运行时依赖全部作为它的传递依赖解析到同一份包,提升到项目根 `node_modules`。
177
165
 
178
- 自动完成:本地 file: 模式清除 node_modules 中的 file: 依赖缓存后重装,强制同步 work 最新
179
- 源码;发布后模式查询 registry 最新版本 → 更新 `package.json` 中 ui-dev-server 声明 →
180
- 重新 `npm install`(能力包 `*` 范围自动对齐最新)。`--skip-install` 可跳过重装。
166
+ ### 为什么直接用 npm 命令带不动这些依赖
181
167
 
182
- ### 本地验证模式(file:)
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 重新解析。
183
173
 
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)
194
-
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
+ 清理范围必须覆盖 ui-dev-server 声明的**全部**依赖:只删 `@bams-app/*` 的话,能力包会刷新,
201
+ 但 vue / axios 等运行时依赖仍停在 lockfile 里的旧版本。
200
202
 
201
- `npm update <pkg>` 会把 ui-dev-server 升到其版本范围允许的最新版,并同步更新依赖树中的
202
- 能力包(`"*"` 范围 最新);跨大版本超出 `^` 约束,需手动修改版本号。
203
+ 只想升 ui-dev-server 本身、不在意它带的依赖时,直接 `npm i @bams-app/ui-dev-server@latest`。
204
+ 跨大版本(0.10.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
@@ -7,25 +7,24 @@ const { colorize } = require('../lib/utils');
7
7
  const pkg = require('../package.json');
8
8
 
9
9
  const COMMANDS = {
10
- create: '初始化 Monorepo 项目模版',
10
+ create: '初始化项目模版',
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
- console.log(' bams-work <command> [options]');
27
+ console.log(' work <command> [options]');
29
28
  console.log('');
30
29
  console.log(colorize('命令:', 'bold'));
31
30
  Object.entries(COMMANDS).forEach(([name, desc]) => {
@@ -33,13 +32,14 @@ function printUsage() {
33
32
  });
34
33
  console.log('');
35
34
  console.log(colorize('示例:', 'bold'));
36
- console.log(' bams-work create my-bams-project # 初始化 Monorepo 项目');
37
- console.log(' bams-work add --dir energy-ui --name ui-order-list');
38
- console.log(' bams-work dev demo ui-component-demo # 启动 work 开发环境');
39
- console.log(' bams-work env # 创建开发环境配置(交互式)');
40
- console.log(' bams-work update # 升级 @bams-app 包');
41
- console.log(' bams-work pages-entry --dir energy-ui --type page');
42
- console.log(' bams-work pages-from-components --dir energy-ui');
35
+ console.log(' work create my-bams-project # 初始化项目');
36
+ console.log(' work add --dir energy-ui --name ui-order-list');
37
+ console.log(' work env # 创建开发环境配置(交互式)');
38
+ console.log(' work pages-entry --dir energy-ui --type page');
39
+ console.log(' work pages-from-components --dir energy-ui');
40
+ console.log('');
41
+ console.log(colorize('开发调试:', 'bold'));
42
+ console.log(' 在项目根目录执行 npm run dev:ui <环境标识>(由项目本地 ui-dev-server 启动并加载 .envs/ 环境文件)');
43
43
  console.log('');
44
44
  }
45
45
 
package/commands/add.js CHANGED
@@ -4,7 +4,7 @@ const { spawn } = require('child_process');
4
4
  const { findProjectRoot, toKebabCase, error, success, info } = require('../lib/utils');
5
5
 
6
6
  /**
7
- * 用法: bams-work add --dir <scope> --name <name> [--type component|page|base]
7
+ * 用法: work add --dir <scope> --name <name> [--type component|page|base]
8
8
  * [--template <tpl>] [--use-component <name>] [--desc <text>]
9
9
  */
10
10
  function parseArgs(args) {
@@ -41,7 +41,7 @@ function ensureWorkspaceScope(projectRoot, scopeDir) {
41
41
  workspaces.push(pattern);
42
42
  pkg.workspaces = workspaces;
43
43
  fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf8');
44
- info(`已注册 workspace: ${pattern}`);
44
+ info(`已注册 scope 目录: ${pattern}`);
45
45
  }
46
46
  }
47
47
 
@@ -77,9 +77,9 @@ async function main(args) {
77
77
  const params = parseArgs(args);
78
78
 
79
79
  if (!params.name) {
80
- error('用法: bams-work add --dir <scope> --name <name> [--type component|page|base]');
81
- error('示例: bams-work add --dir energy-ui --name ui-order-list');
82
- error(' bams-work add --dir energy-ui --name page-order-list --type page');
80
+ error('用法: work add --dir <scope> --name <name> [--type component|page|base]');
81
+ error('示例: work add --dir energy-ui --name ui-order-list');
82
+ error(' work add --dir energy-ui --name page-order-list --type page');
83
83
  process.exit(1);
84
84
  }
85
85
 
@@ -90,7 +90,7 @@ async function main(args) {
90
90
 
91
91
  const projectRoot = findProjectRoot(process.cwd());
92
92
  if (!projectRoot) {
93
- error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请先执行 bams-work create <name>');
93
+ error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请先执行 work create <name>');
94
94
  process.exit(1);
95
95
  }
96
96
 
@@ -131,9 +131,9 @@ 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
- // info(`UMD: bams-work umd ${toKebabCase(params.name)}`);
136
+ // info(`UMD: work umd ${toKebabCase(params.name)}`);
137
137
  }
138
138
 
139
139
  module.exports = main;
package/commands/build.js CHANGED
@@ -3,13 +3,13 @@ const path = require('path');
3
3
  const { findProjectRoot, error, info, run } = require('../lib/utils');
4
4
 
5
5
  /**
6
- * 用法: bams-work build [component] [-- <vue-cli args>]
6
+ * 用法: work build [component] [-- <vue-cli args>]
7
7
  * 委托 @bams-app/ui-dev-server/bin/build-app.js 构建宿主应用(production)
8
8
  */
9
9
  async function main(args) {
10
10
  const projectRoot = findProjectRoot(process.cwd());
11
11
  if (!projectRoot) {
12
- error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请先执行 bams-work create <name>');
12
+ error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请先执行 work create <name>');
13
13
  process.exit(1);
14
14
  }
15
15
 
@@ -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
  */
@@ -111,7 +43,7 @@ async function main(args) {
111
43
  const projectNameArg = args.find((a) => !a.startsWith('-'));
112
44
 
113
45
  if (!projectNameArg) {
114
- error('用法: bams-work create <project-name> [--force]');
46
+ error('用法: work create <project-name> [--force]');
115
47
  process.exit(1);
116
48
  }
117
49
 
@@ -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,13 +111,14 @@ 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
- log(' bams-work add --dir energy-ui --name ui-order-list');
119
+ log(' work add --dir energy-ui --name ui-order-list');
189
120
  log('');
190
- log('更多命令:bams-work --help');
121
+ log('更多命令:work --help');
191
122
  log('');
192
123
  }
193
124
 
package/commands/dev.js CHANGED
@@ -3,13 +3,17 @@ const path = require('path');
3
3
  const { findProjectRoot, error, info, run } = require('../lib/utils');
4
4
 
5
5
  /**
6
- * 用法: bams-work dev <env> [component] [--layout pc|touch] [-- <vue-cli args>]
6
+ * 用法: 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());
11
15
  if (!projectRoot) {
12
- error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请先执行 bams-work create <name>');
16
+ error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请先执行 work create <name>');
13
17
  process.exit(1);
14
18
  }
15
19
 
@@ -45,8 +49,8 @@ async function main(args) {
45
49
  }
46
50
 
47
51
  if (!envAlias) {
48
- error('用法: bams-work dev <env> [component] [--layout pc|touch]');
49
- error('示例: bams-work dev demo ui-component-demo');
52
+ error('用法: work dev <env> [component] [--layout pc|touch]');
53
+ error('示例: work dev demo ui-component-demo');
50
54
  process.exit(1);
51
55
  }
52
56
 
package/commands/umd.js CHANGED
@@ -3,7 +3,7 @@ const path = require('path');
3
3
  const { findProjectRoot, toCamelCase, exists, isDirectory, readJson, error, info, run } = require('../lib/utils');
4
4
 
5
5
  /**
6
- * 用法: bams-work umd [component] [--out <dir>] [--name <name>] [--entry <file>]
6
+ * 用法: work umd [component] [--out <dir>] [--name <name>] [--entry <file>]
7
7
  * component 缺省时自动收集 workspaces 下所有组件
8
8
  * 委托 @bams-app/ui-dev-server/bin/build-umd.js 构建组件 UMD 产物
9
9
  */
@@ -110,7 +110,7 @@ function generateEntryFile({ projectRoot, components }) {
110
110
  async function main(args) {
111
111
  const projectRoot = findProjectRoot(process.cwd());
112
112
  if (!projectRoot) {
113
- error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请先执行 bams-work create <name>');
113
+ error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请先执行 work create <name>');
114
114
  process.exit(1);
115
115
  }
116
116
 
@@ -125,7 +125,7 @@ async function main(args) {
125
125
  }
126
126
 
127
127
  if (components.length === 0) {
128
- error('未找到任何组件(workspaces 下需存在 ui-* / page-* 目录),请先执行 bams-work add --dir <scope> --name ui-xxx');
128
+ error('未找到任何组件(scope 目录下需存在 ui-* / page-* 目录),请先执行 work add --dir <scope> --name ui-xxx');
129
129
  process.exit(1);
130
130
  }
131
131
 
package/package.json CHANGED
@@ -1,10 +1,10 @@
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.2",
4
+ "description": "BAMS-Work 全局开发工具:复用 work 已发布的包(create-env / create-ui-*)提供项目初始化、组件创建与环境配置能力,开发调试由用户项目本地的 ui-dev-server 承担",
5
5
  "main": "index.js",
6
6
  "bin": {
7
- "bams-work": "./bin/work-cli.js"
7
+ "work": "./bin/work-cli.js"
8
8
  },
9
9
  "files": [
10
10
  "bin",
@@ -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 = {
@@ -1,144 +1,75 @@
1
- # BAMS-Work Monorepo 项目
1
+ # BAMS-Work 组件开发项目
2
2
 
3
- 基于 `@bams-app/work-cli` 初始化的组件包开发项目
3
+ `@bams-app/work-cli` 初始化,组件按 scope 目录组织。
4
4
 
5
- ## 目录结构
5
+ ## 目录
6
6
 
7
7
  ```
8
- .
9
- ├── package.json # Monorepo 根(见 package.json 的 workspaces)
10
- ├── .bams-work/ # BAMS-Work 项目标记目录,勿删除
11
- ├── .envs/ # 环境配置(.env.dev-<env>)
12
- ├── .proxy.js # 自定义开发代理(可选)
13
- ├── demo-ui/ # 默认组件 scope
14
- │ └── ui-component-demo # 示例组件
15
- └── <scope>-ui/ # 其他业务 scope 目录(如 energy-ui/,add 时创建)
16
- └── ui-xxx
8
+ package.json # 项目根配置
9
+ .bams-work/ # 项目标记目录,勿删
10
+ .envs/ # 环境配置 .env.dev-<env>
11
+ .proxy.js # 自定义代理(可选)
12
+ demo-ui/ui-component-demo # 示例组件
13
+ <scope>-ui/ui-xxx # 业务组件(add 时创建)
17
14
  ```
18
15
 
19
- ## 快速开始
16
+ ## 开始
20
17
 
21
18
  ```bash
22
- npm install # 安装依赖到根 node_modules
23
- bams-work dev demo # 启动开发环境(示例环境端口 8700)
24
- ```
25
-
26
- > 所有 `bams-work` 命令都在**项目根目录**执行(即含 `.bams-work/` 的目录)。
27
- > 全局帮助 `bams-work --help`,查看版本 `bams-work --version`。
28
-
29
- ## 命令一览
30
-
31
- | 命令 | 作用 |
32
- | ---------------------------------------------------- | --------------------------- |
33
- | `dev <env> [component]` | 启动开发服务(最常用) |
34
- | `add --dir <scope> --name <name>` | 新建组件 / 页面 / 基础组件 |
35
- | `env` | 交互式创建开发环境配置 |
36
- | `update` | 升级 `@bams-app` 依赖 |
37
- | `pages-entry --dir <scope> --type <page\|component>` | 生成 webpack 动态入口 |
38
- | `pages-from-components --dir <scope>` | 批量将 `ui-*` 转为 `page-*` |
39
-
40
- ### 1. `bams-work dev` — 启动开发环境
41
-
42
- ```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
- ```
48
-
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`) |
56
-
57
- 启动地址与接口代理取自环境文件:`PORT` 决定本地端口,`PROXY_TARGET` 决定后端代理目标。
58
-
59
- ### 2. `bams-work add` — 新建组件
60
-
61
- ```bash
62
- bams-work add --dir energy-ui --name ui-order-list # 业务组件(默认 type=component)
63
- bams-work add --dir energy-ui --name page-order-list --type page # 页面
64
- bams-work add --dir demo-ui --name ui-base-btn --type base # 基础组件
19
+ npm install
20
+ npm run dev:ui demo # 环境 demo → .envs/.env.dev-demo
65
21
  ```
66
22
 
67
- | 参数 | 必填 | 说明 |
68
- | -------- | ---- | ----------------------------------------------------------------------------------------------------------------------- |
69
- | `--dir` | 是 | scope 目录名(小写字母、数字、连字符,如 `energy-ui`);不存在会自动创建,并自动注册到根 `package.json` 的 `workspaces` |
70
- | `--name` | 是 | 组件名,自动转为 kebab-case;`component`/`base` 建议 `ui-` 前缀,`page` 建议 `page-` 前缀 |
71
- | `--type` | 否 | `component`(默认)/ `page` / `base` |
72
- | `--desc` | 否 | 组件描述 |
73
-
74
- 创建完成后会提示用哪条 `dev` 命令调试。
75
-
76
- ### 3. `bams-work env` — 创建开发环境
77
-
78
- 交互式向导,无需记参数,生成 `.envs/.env.dev-<标识>`:
23
+ `dev:ui` 由项目本地的 `@bams-app/ui-dev-server` 提供:
79
24
 
80
25
  ```bash
81
- bams-work env
26
+ npm run dev:ui demo ui-order-list # 位置参数1=环境标识,位置参数2=组件目录名
27
+ npm run dev:ui demo ui-order-list -l touch # 布局 pc(默认)/ touch
28
+ npm run dev:ui demo -- --port 8080 # `--` 之后透传给 vue-cli-service
82
29
  ```
83
30
 
84
- 流程:列出已有环境与已占用端口 选择创建方式 → 输入环境标识 → 逐项填写配置 → 预览确认后写入。
85
-
86
- 创建方式二选一:
31
+ 环境文件缺失会直接报错;`PORT` 决定端口,`PROXY_TARGET` 决定代理目标。
87
32
 
88
- - **快速复制**:基于现有环境文件,或 `production` 空值模板,只改差异项(推荐)
89
- - **自定义配置**:从默认模板逐项填写
33
+ ## 命令
90
34
 
91
- 环境标识即 `dev` 的第一个参数:`bams-work env` 创建了 `test`,就用 `bams-work dev test` 启动。
35
+ | 命令 | 作用 |
36
+ | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
37
+ | `npm run dev:ui <环境标识> [组件名]` | 启动开发服务 |
38
+ | `work add --dir <scope> --name <name> [--type component\|page\|base] [--desc ...]` | 新建组件/页面/基础组件;scope 目录不存在会自动创建并注册到根 `package.json` |
39
+ | `work env` | 交互式生成 `.envs/.env.dev-<标识>` |
40
+ | `work pages-entry --dir <scope> --type page\|component` | 生成构建用动态入口(内部使用) |
41
+ | `work pages-from-components --dir <scope>` | 把 `ui-*` 批量复制为 `page-*` |
92
42
 
93
- 常用字段(可直接编辑对应环境文件,`dev` 每次启动都会重新加载):
43
+ 环境文件字段:`PORT`、`PROXY_TARGET`、`BASE_URL`、`VUE_APP_*` 等,见模板文件;改完重跑 `dev:ui` 生效。
94
44
 
95
- | 字段 | 说明 |
96
- | ------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
97
- | `NODE_ENV` | 运行环境,固定 `development` |
98
- | `PORT` | 开发服务器端口(创建时自动避开其他环境已占用的端口) |
99
- | `PROXY_TARGET` | 接口代理目标(后端服务地址) |
100
- | `BASE_URL` | 应用基础路径,默认 `/` |
101
- | `COMPONENT_LOGIN`、`COMPONENT_STARTR_LAYOUT` | 可配置组件插槽:登录页 / 布局组件包名 |
102
- | `VUE_APP_TITLE`、`VUE_APP_SYS_NAME`、`VUE_APP_SYS_CODE` | 浏览器标签标题、系统名称、系统编码 |
103
- | `VUE_APP_SHOW_HEADER`、`VUE_APP_ENABLE_THEME`、`VUE_APP_THEME_MODE`、`VUE_APP_THEME_PRESET` | 头部显示与主题(模式 / 预设色) |
104
- | `VUE_APP_ENABLE_I18N`、`VUE_APP_ENABLE_VERSION_LOG`、`VUE_APP_TABS_EXPAND_STATE` | 国际化、版本日志、Tabs 展开/收起 |
105
- | `VUE_APP_ENABLE_CAPTCHA`、`VUE_APP_ENABLE_MESSAGE_VOICE`、`VUE_APP_MESSAGE_WS_URL` | 登录验证码、消息告警通知及其 WS 地址 |
106
- | `VUE_APP_LOGIN_URL`、`VUE_APP_LOGIN_PUBLIC_KEY`、`VUE_APP_WEBSOCKET_URL` | 登录页地址、登录公钥、WebSocket 地址 |
107
- | `VUE_APP_DEVEXTREME_LICENSE_KEY` | DevExtreme 许可证密钥(可留空) |
45
+ ## 依赖升级
108
46
 
109
- ### 4. `bams-work update` 升级依赖
47
+ 项目只声明 `@bams-app/ui-dev-server`,能力包与 vue、devextreme 等运行时依赖都由它提供并提升到根 `node_modules`。
110
48
 
111
49
  ```bash
112
- bams-work update # 升级并重装依赖
50
+ npm i @bams-app/ui-dev-server@latest # 只换 ui-dev-server
113
51
  ```
114
52
 
115
- ### 5. 其他命令
116
-
117
- - `bams-work pages-entry --dir <scope> --type page|component`:扫描该 scope 下的 `page-*` / `ui-*` 目录,生成 webpack 动态入口 `build-components-entry.js`(构建流程内部使用,一般无需手动执行)
118
- - `bams-work pages-from-components --dir <scope>`:把该 scope 下的 `ui-*` 组件批量复制为 `page-*` 页面
119
-
120
- ## 首次安装
53
+ lockfile 会把 ui-dev-server 提供的包逐个钉死;要连带刷新这些包,先清理记录再安装:
121
54
 
122
55
  ```bash
56
+ node -e "
57
+ const fs=require('fs');
58
+ const dev=JSON.parse(fs.readFileSync('node_modules/@bams-app/ui-dev-server/package.json','utf8'));
59
+ const names=new Set([...Object.keys(dev.dependencies||{}),'@bams-app/ui-dev-server']);
60
+ const lock=JSON.parse(fs.readFileSync('package-lock.json','utf8'));
61
+ let n=0;
62
+ for(const s of ['packages','dependencies']){const c=lock[s];if(!c)continue;
63
+ for(const k of Object.keys(c))if(names.has(k.replace(/^.*node_modules\//,''))){delete c[k];n++}}
64
+ fs.writeFileSync('package-lock.json',JSON.stringify(lock,null,2)+'\n');
65
+ console.log('已清理',n,'条');
66
+ "
123
67
  npm install
124
- # 或
125
- yarn install
126
- ```
127
-
128
- `@bams-app/ui-dev-server` 及其依赖的能力包(`@bams-app/components` 等)会安装到根 node_modules,
129
- 业务组件与 work 开发环境共用同一套能力实例;能力包的传递依赖(vue、ant-design-vue 等)由 npm
130
- 自动安装,因此 `package.json` 无需声明任何外部运行时依赖。
131
-
132
- ## 升级 CLI
133
-
134
- ```bash
135
- npm i -g @bams-app/work-cli@latest
136
68
  ```
137
69
 
138
- 项目运行时依赖只有 `@bams-app/ui-dev-server`,其余能力包(`@bams-app/components` 等)由它传递安装,
139
- 升级项目依赖用 `bams-work update`(见上文)。
70
+ 全局 CLI 升级:`npm i -g @bams-app/work-cli@latest`。
140
71
 
141
- ## 自定义配置
72
+ ## 自定义
142
73
 
143
- - 代理:创建项目根 `.proxy.js`(见 `.proxy.js.example`)
144
- - webpack 扩展:创建项目根 `vue.config.extend.js`(导出对象或 `({ env, projectRoot }) => 对象`)
74
+ - 代理:项目根 `.proxy.js`(参考 `.proxy.js.example`),声明的前缀优先于内置默认,修改后需重启
75
+ - 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,8 +1,8 @@
1
1
  {
2
- "name": "__PROJECT_NAME__",
2
+ "name": "bams-work-project",
3
3
  "version": "0.0.6",
4
4
  "private": true,
5
- "description": "BAMS-Work Monorepo 项目",
5
+ "description": "BAMS-Work 项目",
6
6
  "workspaces": [
7
7
  "demo-ui/*",
8
8
  "bams-components/*",
@@ -11,26 +11,10 @@
11
11
  "bams-ui"
12
12
  ],
13
13
  "scripts": {
14
- "dev": "bams-work dev",
15
- "add": "bams-work add"
14
+ "dev:ui": "ui-dev-server",
15
+ "add": "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
- }