@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 +92 -108
- package/bin/work-cli.js +13 -13
- package/commands/add.js +8 -8
- package/commands/build.js +2 -2
- package/commands/create.js +11 -80
- package/commands/dev.js +8 -4
- package/commands/umd.js +3 -3
- package/package.json +4 -6
- package/templates/project/.proxy.js.example +10 -1
- package/templates/project/README.md +45 -114
- package/templates/project/gitignore.tpl +0 -3
- package/templates/project/package.json +6 -22
- 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
|
|
13
|
-
| 开发服务
|
|
14
|
-
| 环境变量加载
|
|
15
|
-
| 环境配置创建
|
|
16
|
-
| 动态入口生成
|
|
17
|
-
| 批量页面创建
|
|
18
|
-
| 公共配置
|
|
19
|
-
|
|
20
|
-
- `create` 生成 **scope
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- 项目根 `package.json`
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
`
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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/
|
|
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 /
|
|
46
|
+
D["create / add / env<br/>pages-entry / pages-from-components"]
|
|
47
47
|
end
|
|
48
|
-
subgraph PROJ["
|
|
49
|
-
E["package.json<br
|
|
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 -->|"
|
|
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
|
-
用户项目(
|
|
63
|
-
├── package.json #
|
|
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
|
-
#
|
|
83
|
-
|
|
83
|
+
# 初始化项目模版
|
|
84
|
+
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
|
-
|
|
94
|
-
|
|
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>`
|
|
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>` | 初始化项目模版(含示例组件与 `.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>`
|
|
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 到空入口,保证编译不报错。
|
|
@@ -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/`、`
|
|
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
|
-
|
|
161
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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
|
-
|
|
179
|
-
源码;发布后模式查询 registry 最新版本 → 更新 `package.json` 中 ui-dev-server 声明 →
|
|
180
|
-
重新 `npm install`(能力包 `*` 范围自动对齐最新)。`--skip-install` 可跳过重装。
|
|
166
|
+
### 为什么直接用 npm 命令带不动这些依赖
|
|
181
167
|
|
|
182
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
@@ -7,25 +7,24 @@ const { colorize } = require('../lib/utils');
|
|
|
7
7
|
const pkg = require('../package.json');
|
|
8
8
|
|
|
9
9
|
const COMMANDS = {
|
|
10
|
-
create: '
|
|
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
|
-
|
|
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
|
-
console.log('
|
|
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('
|
|
37
|
-
console.log('
|
|
38
|
-
console.log('
|
|
39
|
-
console.log('
|
|
40
|
-
console.log('
|
|
41
|
-
console.log('
|
|
42
|
-
console.log('
|
|
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
|
-
* 用法:
|
|
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(`已注册
|
|
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('用法:
|
|
81
|
-
error('示例:
|
|
82
|
-
error('
|
|
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 目录),请先执行
|
|
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(`开发:
|
|
134
|
+
info(`开发: npm run dev:ui <环境标识> -c ${toKebabCase(params.name)}`);
|
|
135
135
|
// UMD 命令暂时下线,恢复后取消注释
|
|
136
|
-
// info(`UMD:
|
|
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
|
-
* 用法:
|
|
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 目录),请先执行
|
|
12
|
+
error('未找到 BAMS-Work 项目(缺少 .bams-work 目录),请先执行 work create <name>');
|
|
13
13
|
process.exit(1);
|
|
14
14
|
}
|
|
15
15
|
|
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
|
*/
|
|
@@ -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('用法:
|
|
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.
|
|
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,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('
|
|
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
|
-
log('
|
|
119
|
+
log(' work add --dir energy-ui --name ui-order-list');
|
|
189
120
|
log('');
|
|
190
|
-
log('更多命令:
|
|
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
|
-
* 用法:
|
|
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 目录),请先执行
|
|
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('用法:
|
|
49
|
-
error('示例:
|
|
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
|
-
* 用法:
|
|
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 目录),请先执行
|
|
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('未找到任何组件(
|
|
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.
|
|
4
|
-
"description": "BAMS-Work 全局开发工具:复用 work 已发布的包(
|
|
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
|
-
"
|
|
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
|
|
1
|
+
# BAMS-Work 组件开发项目
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
由 `@bams-app/work-cli` 初始化,组件按 scope 目录组织。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 目录
|
|
6
6
|
|
|
7
7
|
```
|
|
8
|
-
.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
- **自定义配置**:从默认模板逐项填写
|
|
33
|
+
## 命令
|
|
90
34
|
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
+
项目只声明 `@bams-app/ui-dev-server`,能力包与 vue、devextreme 等运行时依赖都由它提供并提升到根 `node_modules`。
|
|
110
48
|
|
|
111
49
|
```bash
|
|
112
|
-
bams-
|
|
50
|
+
npm i @bams-app/ui-dev-server@latest # 只换 ui-dev-server
|
|
113
51
|
```
|
|
114
52
|
|
|
115
|
-
|
|
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
|
-
|
|
139
|
-
升级项目依赖用 `bams-work update`(见上文)。
|
|
70
|
+
全局 CLI 升级:`npm i -g @bams-app/work-cli@latest`。
|
|
140
71
|
|
|
141
|
-
##
|
|
72
|
+
## 自定义
|
|
142
73
|
|
|
143
|
-
-
|
|
144
|
-
- webpack
|
|
74
|
+
- 代理:项目根 `.proxy.js`(参考 `.proxy.js.example`),声明的前缀优先于内置默认,修改后需重启
|
|
75
|
+
- webpack:项目根 `vue.config.extend.js`,导出对象或 `({ env, projectRoot }) => 对象`
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
2
|
+
"name": "bams-work-project",
|
|
3
3
|
"version": "0.0.6",
|
|
4
4
|
"private": true,
|
|
5
|
-
"description": "BAMS-Work
|
|
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": "
|
|
15
|
-
"add": "
|
|
14
|
+
"dev:ui": "ui-dev-server",
|
|
15
|
+
"add": "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
|
-
}
|