@infly/libs 2.0.46 → 2.0.47
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 +186 -142
- package/bin/cli.js +148 -120
- package/build/docker/docker-build-push.js +373 -240
- package/build/docker/release-docker.js +199 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,142 +1,186 @@
|
|
|
1
|
-
# @infly/libs
|
|
2
|
-
|
|
3
|
-
## 介绍
|
|
4
|
-
|
|
5
|
-
`@infly/libs` 是不受 Vue、React 等前端框架限制的独立 JavaScript 工具库。包根入口无副作用;HTTP、Token、文件处理、Docker/Compose、通用项目命令等能力可被不同技术栈使用。
|
|
6
|
-
|
|
7
|
-
Vue 2 专属的 Permission、Vuex store、实例 mixin、Vue CLI 预览和 webpack 配置集中在 `adapters/vue2/`,避免核心入口依赖 Vue 项目约定。
|
|
8
|
-
|
|
9
|
-
## 注意事项
|
|
10
|
-
|
|
11
|
-
新代码应显式导入 Vue 2 适配路径。Webpack 适配器仅服务脱离
|
|
12
|
-
admin-monorepo 的子模块独立构建;Monorepo 根构建不会调用该实现。
|
|
13
|
-
|
|
14
|
-
## 软件架构
|
|
15
|
-
|
|
16
|
-
```text
|
|
17
|
-
@infly/libs
|
|
18
|
-
├── index.js # 框架无关、无副作用的包根入口
|
|
19
|
-
├── module/ # HTTP、Token、格式化等通用模块
|
|
20
|
-
├── tools/ # 文件与项目命令等通用工具
|
|
21
|
-
├── build/
|
|
22
|
-
│ ├── docker/ # Docker/Compose 工具
|
|
23
|
-
│ └── build-dist/ # 构建产物处理
|
|
24
|
-
├── adapters/vue2/
|
|
25
|
-
│ ├── module/file-export.js # 注入请求与 Element UI 能力的 Vue2 导出 mixin
|
|
26
|
-
│ ├── module/Permission.js # Vue Router/Vuex 权限适配
|
|
27
|
-
│ ├── store/ # Vuex 模块
|
|
28
|
-
│ ├── project-preview.js # Vue CLI 预览
|
|
29
|
-
│ ├── script-config.js # Vue CLI 脚本模板
|
|
30
|
-
│ ├── vite/ # Monorepo Vite 定位与兼容入口
|
|
31
|
-
│ ├── webpack5/ # 独立子仓 Webpack 兼容适配器
|
|
32
|
-
│ └── postinstall.js # 仅 Vue 2 项目执行初始化
|
|
33
|
-
├── bin/cli.js # 命令行入口
|
|
34
|
-
└── dataInit/ # 公共枚举
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Vue2 文件导出适配:
|
|
38
|
-
|
|
39
|
-
```javascript
|
|
40
|
-
import { fileExportMixin } from "@infly/libs/adapters/vue2/module/file-export.js";
|
|
41
|
-
|
|
42
|
-
Vue.mixin(fileExportMixin);
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
适配器只负责从 Vue 实例注入 `$axios`、`$message`、`$msgbox` 和 `$loading`;确认、请求与下载流程由 `@infly/ts-libs` 的 `exportFile` 实现。`@infly/ui` 不公开该 mixin。
|
|
46
|
-
|
|
47
|
-
根入口加载示例:
|
|
48
|
-
|
|
49
|
-
```javascript
|
|
50
|
-
const inflyLibs = require('@infly/libs');
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
根入口继续保留历史 `init()` API,但只在显式调用时懒加载 Vue 2 适配器,不会在 `require('@infly/libs')` 时自动执行:
|
|
54
|
-
|
|
55
|
-
```javascript
|
|
56
|
-
inflyLibs.init();
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## 安装教程
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
# 项目安装
|
|
63
|
-
npm/pnpm install @infly/libs
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Docker 镜像构建
|
|
67
|
-
|
|
68
|
-
在应用目录中执行:
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
infly-libs build:docker --local --env prod
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
可通过可选参数 `--cicd-url` 在构建和镜像推送全部成功后输出蓝色发布系统链接。支持等号和空格两种传参形式:
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
infly-libs build:docker --local --cicd-url="https://deploy.example.com/projects/admin/"
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
infly-libs build:docker --local --cicd-url "https://deploy.example.com/projects/admin/"
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
未传 `--cicd-url` 时保持原有输出。参数值必须是合法的 HTTP/HTTPS URL,且不能包含用户名、密码或控制字符。
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
1
|
+
# @infly/libs
|
|
2
|
+
|
|
3
|
+
## 介绍
|
|
4
|
+
|
|
5
|
+
`@infly/libs` 是不受 Vue、React 等前端框架限制的独立 JavaScript 工具库。包根入口无副作用;HTTP、Token、文件处理、Docker/Compose、通用项目命令等能力可被不同技术栈使用。
|
|
6
|
+
|
|
7
|
+
Vue 2 专属的 Permission、Vuex store、实例 mixin、Vue CLI 预览和 webpack 配置集中在 `adapters/vue2/`,避免核心入口依赖 Vue 项目约定。
|
|
8
|
+
|
|
9
|
+
## 注意事项
|
|
10
|
+
|
|
11
|
+
新代码应显式导入 Vue 2 适配路径。Webpack 适配器仅服务脱离
|
|
12
|
+
admin-monorepo 的子模块独立构建;Monorepo 根构建不会调用该实现。
|
|
13
|
+
|
|
14
|
+
## 软件架构
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
@infly/libs
|
|
18
|
+
├── index.js # 框架无关、无副作用的包根入口
|
|
19
|
+
├── module/ # HTTP、Token、格式化等通用模块
|
|
20
|
+
├── tools/ # 文件与项目命令等通用工具
|
|
21
|
+
├── build/
|
|
22
|
+
│ ├── docker/ # Docker/Compose 工具
|
|
23
|
+
│ └── build-dist/ # 构建产物处理
|
|
24
|
+
├── adapters/vue2/
|
|
25
|
+
│ ├── module/file-export.js # 注入请求与 Element UI 能力的 Vue2 导出 mixin
|
|
26
|
+
│ ├── module/Permission.js # Vue Router/Vuex 权限适配
|
|
27
|
+
│ ├── store/ # Vuex 模块
|
|
28
|
+
│ ├── project-preview.js # Vue CLI 预览
|
|
29
|
+
│ ├── script-config.js # Vue CLI 脚本模板
|
|
30
|
+
│ ├── vite/ # Monorepo Vite 定位与兼容入口
|
|
31
|
+
│ ├── webpack5/ # 独立子仓 Webpack 兼容适配器
|
|
32
|
+
│ └── postinstall.js # 仅 Vue 2 项目执行初始化
|
|
33
|
+
├── bin/cli.js # 命令行入口
|
|
34
|
+
└── dataInit/ # 公共枚举
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Vue2 文件导出适配:
|
|
38
|
+
|
|
39
|
+
```javascript
|
|
40
|
+
import { fileExportMixin } from "@infly/libs/adapters/vue2/module/file-export.js";
|
|
41
|
+
|
|
42
|
+
Vue.mixin(fileExportMixin);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
适配器只负责从 Vue 实例注入 `$axios`、`$message`、`$msgbox` 和 `$loading`;确认、请求与下载流程由 `@infly/ts-libs` 的 `exportFile` 实现。`@infly/ui` 不公开该 mixin。
|
|
46
|
+
|
|
47
|
+
根入口加载示例:
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
const inflyLibs = require('@infly/libs');
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
根入口继续保留历史 `init()` API,但只在显式调用时懒加载 Vue 2 适配器,不会在 `require('@infly/libs')` 时自动执行:
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
inflyLibs.init();
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 安装教程
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# 项目安装
|
|
63
|
+
npm/pnpm install @infly/libs
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Docker 镜像构建
|
|
67
|
+
|
|
68
|
+
在应用目录中执行:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
infly-libs build:docker --local --env prod
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
可通过可选参数 `--cicd-url` 在构建和镜像推送全部成功后输出蓝色发布系统链接。支持等号和空格两种传参形式:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
infly-libs build:docker --local --cicd-url="https://deploy.example.com/projects/admin/"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
infly-libs build:docker --local --cicd-url "https://deploy.example.com/projects/admin/"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
未传 `--cicd-url` 时保持原有输出。参数值必须是合法的 HTTP/HTTPS URL,且不能包含用户名、密码或控制字符。
|
|
85
|
+
|
|
86
|
+
需要在推送前验证镜像自身的 Docker `HEALTHCHECK` 时,可启用可选健康门禁:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
infly-libs build:docker --local --health-check --health-timeout=60
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- `--health-check`:构建后启动临时容器,只有镜像状态变为 `healthy` 才推送;失败或超时会清理临时容器并阻止所有标签推送。
|
|
93
|
+
- `--health-timeout`:等待秒数,范围为 1 到 600,默认 60。
|
|
94
|
+
- `--health-add-host`:可选的临时容器主机映射,格式为 `HOST:IP` 或 `HOST:host-gateway`,用于镜像启动时必须解析内部服务名的场景。
|
|
95
|
+
|
|
96
|
+
未启用 `--health-check` 时保持原有“构建后直接推送”行为。镜像必须在 Dockerfile 中定义 `HEALTHCHECK`,否则门禁失败。
|
|
97
|
+
|
|
98
|
+
发布不可变 commit 镜像时还可组合:
|
|
99
|
+
|
|
100
|
+
- `--standalone`:即使当前项目位于 submodule,也强制以当前 Git 仓库根目录和本地 `Dockerfile` 为构建上下文;命令必须在该仓库根目录执行。
|
|
101
|
+
- `--commit-only`:只构建并推送 commit 标签,不更新环境标签或 `latest`。
|
|
102
|
+
- `--tag-prefix <prefix>`:为本次调用产生的全部镜像标签添加统一前缀(如隔离标签 `qc-`)。前缀必须以字母或数字开头,最多 40 字符,只允许字母、数字、点、下划线和连字符。设置前缀后本地不产生裸发布标签,发布标签应由 CI 在质量门禁通过后晋升产生。
|
|
103
|
+
|
|
104
|
+
### 可复用的本地质量发布
|
|
105
|
+
|
|
106
|
+
需要在多个前端复用“项目检查 → 可选 SonarQube → 构建/健康门禁/推送”时,在应用 `package.json` 声明项目差异:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"infly": {
|
|
111
|
+
"dockerRelease": {
|
|
112
|
+
"checks": ["lint", "typecheck", "test:coverage"],
|
|
113
|
+
"coverageReport": "coverage/lcov.info",
|
|
114
|
+
"sonar": true
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
然后执行:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
infly-libs release:docker --local --health-check --health-timeout=60
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
`checks` 中的名称必须对应应用已有的 pnpm script;任一检查、覆盖率文件验证、Sonar Quality Gate 或镜像健康门禁失败,命令都会退出且不会推送镜像。`sonar` 默认为 `true`;设为 `false` 时由 CI 单独负责扫描和 Quality Gate。本地启用 Sonar 时必须通过当前进程环境或应用根目录下被 Git 忽略的 `.env.production.local` 提供 `SONAR_TOKEN`,并确保 `sonar-scanner` CLI 可执行;当前进程环境变量的优先级更高。`release:docker` 会拒绝含未提交文件的应用工作树,固定使用 12 位应用 commit 作为镜像标签,并把完整 commit 写入 OCI revision label;普通 `build:docker` 的原有版本来源保持不变。应用差异保留在应用配置,通用编排由 `infly-libs` 维护。
|
|
127
|
+
|
|
128
|
+
受控紧急构建可使用 `--emergency` 跳过 `checks`、覆盖率文件校验和 Sonar,但必须提供 8~200 个字符且无控制字符的 `--emergency-reason`,并同时启用 `--standalone --commit-only --health-check`。紧急模式仍执行工作树干净检查、commit/revision 解析、镜像构建、健康检查和推送;缺少任一保护参数会在调用 Docker 前失败。
|
|
129
|
+
|
|
130
|
+
## HTTP 环境保护配置
|
|
131
|
+
|
|
132
|
+
`module/REST.js` 不内置任何项目域名。应用如需在测试环境误连正式接口时告警,应由应用显式注入完整的正式 API 基地址:
|
|
133
|
+
|
|
134
|
+
```javascript
|
|
135
|
+
const service = createService({
|
|
136
|
+
productionBaseURLs: ["https://api.example.com"]
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
未传 `productionBaseURLs` 时不启用该项目级域名判断。
|
|
141
|
+
|
|
142
|
+
## 配置驱动的项目命令
|
|
143
|
+
|
|
144
|
+
`project` 命令将多平台项目的开发和构建目标从 package scripts 移到项目配置:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
infly-libs project
|
|
148
|
+
infly-libs project dev
|
|
149
|
+
infly-libs project build
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
命令从当前目录 `package.json` 的 `infly.targets`、`infly.dev` 和 `infly.build` 读取配置。交互选择会追加“退出”选项;选择退出或按取消键时会正常结束,不执行后续命令。项目命令不支持 `--config` 文件入口。
|
|
153
|
+
|
|
154
|
+
未指定 action、target 或构建环境时,会在 TTY 中显示单选菜单。CI/CD 必须显式传参:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
infly-libs project dev --target QDXY
|
|
158
|
+
infly-libs project build --env stage --target SQ223
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
`--dry-run` 只打印带 `VUE_APP_PLATFORM` 的命令计划。`infly.targets` 推荐使用平台代码数组,例如 `["DEFAULT", "MER", "JXEE"]`;同时兼容对象形式,对象值中的 `label` 只用于交互显示。普通 target 就是注入 `VUE_APP_PLATFORM` 的平台代码,批量构建通过 `build.presets` 组合多个 target。
|
|
162
|
+
|
|
163
|
+
`dev.command` 以及 `build.before/command/after` 同时支持字符串和参数数组。字符串按空白拆分为可执行文件和参数,不经过 shell;参数本身包含空格时应继续使用数组形式。
|
|
164
|
+
|
|
165
|
+
`build.environments` 推荐使用 `选择键:实际 mode` 数组,例如 `["prod:production", "stage:staging"]`;CLI 使用冒号前的值进行选择,并把冒号后的值作为 `--mode` 参数。没有冒号时选择键和 mode 同名。对象形式继续兼容,用于自定义 `label`、`mode` 或 `args`。项目如果自行管理构建入口,应设置 `infly.buildConfigs.manageScripts=false`,避免安装阶段重新写入传统 `build:prod/build:stage`。
|
|
166
|
+
|
|
167
|
+
### Docker Compose 版本发布
|
|
168
|
+
|
|
169
|
+
`docker:compose` 面向已有 Compose 文件的镜像版本递增、配置校验和构建,与上面的 Dockerfile/commit-tag `build:docker` 流程互不替代:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
infly-libs docker:compose --target yhqy --bump patch
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
默认从当前目录 `package.json` 的 `infly.docker.targets` 读取目标,并以该 package 所在目录解析 Compose 相对路径;省略 `--target` 时在 TTY 中交互选择。`--config` 外部 JS 配置和原有 `--project-dir` + `--file` 直传方式继续兼容。
|
|
176
|
+
|
|
177
|
+
参数约束:
|
|
178
|
+
|
|
179
|
+
- `--target`:选择 `infly.docker.targets` 或外部配置中的目标;非交互环境必须显式传入。
|
|
180
|
+
- `--config`:可选的外部 JS 配置文件,使用 `targets.<name>.file` 结构。
|
|
181
|
+
- `--project-dir` + `--file`:不使用 target 配置时的兼容直传方式,Compose 文件不能越出 `project-dir`。
|
|
182
|
+
- `--bump patch`:目前只支持 patch 递增,且 Compose 中必须恰好有一个 `x.y.z` 镜像 tag。
|
|
183
|
+
- `--push`:显式推送;未传时只执行 `docker compose config` 和 `build`。
|
|
184
|
+
- `--dry-run`:只打印版本变化和计划命令,不写文件、不调用 Docker。
|
|
185
|
+
|
|
186
|
+
构建、校验或推送失败时,命令会恢复原 Compose 内容。公共包不内置 yhqy、qdxy 等业务目标映射;目标配置和单一发布 script 应归 Compose 所在项目所有。
|
package/bin/cli.js
CHANGED
|
@@ -1,120 +1,148 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
function loadBuildDist() {
|
|
4
|
-
return require("../build/build-dist");
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
function loadPreview() {
|
|
8
|
-
return require("../adapters/vue2/project-preview");
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function parseArgs(argv) {
|
|
12
|
-
const options = { env: "prod", local: false, dryRun: false };
|
|
13
|
-
const valueOptions = {
|
|
14
|
-
"--env": "env",
|
|
15
|
-
"--cicd-url": "cicdUrl",
|
|
16
|
-
"--project-dir": "projectDir",
|
|
17
|
-
"--file": "file",
|
|
18
|
-
"--bump": "bump",
|
|
19
|
-
"--config": "config",
|
|
20
|
-
"--target": "target",
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
options
|
|
60
|
-
i
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
function loadBuildDist() {
|
|
4
|
+
return require("../build/build-dist");
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function loadPreview() {
|
|
8
|
+
return require("../adapters/vue2/project-preview");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function parseArgs(argv) {
|
|
12
|
+
const options = { env: "prod", local: false, dryRun: false };
|
|
13
|
+
const valueOptions = {
|
|
14
|
+
"--env": "env",
|
|
15
|
+
"--cicd-url": "cicdUrl",
|
|
16
|
+
"--project-dir": "projectDir",
|
|
17
|
+
"--file": "file",
|
|
18
|
+
"--bump": "bump",
|
|
19
|
+
"--config": "config",
|
|
20
|
+
"--target": "target",
|
|
21
|
+
"--health-timeout": "healthTimeout",
|
|
22
|
+
"--health-add-host": "healthAddHost",
|
|
23
|
+
"--emergency-reason": "emergencyReason",
|
|
24
|
+
"--tag-prefix": "tagPrefix",
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
let i = 0;
|
|
28
|
+
while (i < argv.length) {
|
|
29
|
+
const arg = argv[i];
|
|
30
|
+
const equalsIndex = arg.indexOf("=");
|
|
31
|
+
if (equalsIndex > 0) {
|
|
32
|
+
const flag = arg.slice(0, equalsIndex);
|
|
33
|
+
const key = valueOptions[flag];
|
|
34
|
+
if (key) {
|
|
35
|
+
const value = arg.slice(equalsIndex + 1);
|
|
36
|
+
if (!value) throw new Error(`${flag} requires a value.`);
|
|
37
|
+
options[key] = value;
|
|
38
|
+
i++;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (arg === "--local") {
|
|
44
|
+
options.local = true;
|
|
45
|
+
i++;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (arg === "--standalone") {
|
|
49
|
+
options.standalone = true;
|
|
50
|
+
i++;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (arg === "--commit-only") {
|
|
54
|
+
options.commitOnly = true;
|
|
55
|
+
i++;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (arg === "--emergency") {
|
|
59
|
+
options.emergency = true;
|
|
60
|
+
i++;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (arg === "--dry-run") {
|
|
64
|
+
options.dryRun = true;
|
|
65
|
+
i++;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (arg === "--push") {
|
|
69
|
+
options.push = true;
|
|
70
|
+
i++;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (arg === "--health-check") {
|
|
74
|
+
options.healthCheck = true;
|
|
75
|
+
i++;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const key = valueOptions[arg];
|
|
80
|
+
if (key) {
|
|
81
|
+
const value = argv[i + 1];
|
|
82
|
+
if (!value || value.startsWith("--")) throw new Error(`${arg} requires a value.`);
|
|
83
|
+
options[key] = value;
|
|
84
|
+
i += 2;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
i++;
|
|
89
|
+
}
|
|
90
|
+
return options;
|
|
91
|
+
}
|
|
92
|
+
function parseProjectArgs(argv) {
|
|
93
|
+
const options = parseArgs(argv);
|
|
94
|
+
const hasExplicitEnv = argv.some((arg) => arg === "--env" || arg.startsWith("--env="));
|
|
95
|
+
delete options.local;
|
|
96
|
+
if (!hasExplicitEnv) delete options.env;
|
|
97
|
+
return options;
|
|
98
|
+
}
|
|
99
|
+
async function main(argv = process.argv.slice(2)) {
|
|
100
|
+
const command = argv[0];
|
|
101
|
+
const commandMap = {
|
|
102
|
+
afterBuild: () => loadBuildDist().init(),
|
|
103
|
+
initZip: () => loadBuildDist().init(),
|
|
104
|
+
preview: () => loadPreview().init(),
|
|
105
|
+
"--preview": () => loadPreview().init(),
|
|
106
|
+
beforeBuild: () => loadBuildDist().beforeBuild(),
|
|
107
|
+
scriptOverride: () => {
|
|
108
|
+
const preview = loadPreview();
|
|
109
|
+
const buildDist = loadBuildDist();
|
|
110
|
+
preview.scriptInit();
|
|
111
|
+
buildDist.scriptInit();
|
|
112
|
+
},
|
|
113
|
+
"build:docker": () => {
|
|
114
|
+
const opts = parseArgs(argv.slice(1));
|
|
115
|
+
return require("../build/docker/docker-build-push").dockerBuildPush(opts);
|
|
116
|
+
},
|
|
117
|
+
"release:docker": () => {
|
|
118
|
+
const opts = parseArgs(argv.slice(1));
|
|
119
|
+
return require("../build/docker/release-docker").releaseDocker(opts);
|
|
120
|
+
},
|
|
121
|
+
"docker:compose": () => {
|
|
122
|
+
const opts = parseArgs(argv.slice(1));
|
|
123
|
+
return require("../build/docker/compose-command").runComposeCommand(opts);
|
|
124
|
+
},
|
|
125
|
+
project: () => {
|
|
126
|
+
const action = argv[1] && !argv[1].startsWith("--") ? argv[1] : undefined;
|
|
127
|
+
const opts = parseProjectArgs(argv.slice(action ? 2 : 1));
|
|
128
|
+
return require("../tools/project-command").runProjectCommand({ ...opts, action });
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
if (command && commandMap[command]) {
|
|
133
|
+
await commandMap[command]();
|
|
134
|
+
} else {
|
|
135
|
+
console.error(`未知命令: ${command || "未提供命令"}`);
|
|
136
|
+
console.log(`可用命令: ${Object.keys(commandMap).join(", ")}`);
|
|
137
|
+
process.exitCode = 1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (require.main === module) {
|
|
142
|
+
main().catch((error) => {
|
|
143
|
+
console.error("执行失败:", error.message || error);
|
|
144
|
+
process.exitCode = 1;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
module.exports = { main, parseArgs, parseProjectArgs };
|