|
|
@@ -11,37 +11,55 @@ r"""打一个"拷到别的电脑能装、能跑"的分发包 (2026-09-12)。
|
|
|
|
|
|
## 包含 / 排除 (规则即文档)
|
|
|
|
|
|
+★ 2026-09-17 用户令: **交付包默认不含 输入数据 / 产物(输出数据) / 运行日志 / 临时文件** ——
|
|
|
+即"开箱是一套干净的程序", 数据与产物到目标机自己放、自己算。默认执行
|
|
|
+`python scripts/pack_dist.py` 就是这四类全不含, 不需要任何开关 (要破例才加 `--with-data` / `--with-products`)。
|
|
|
+
|
|
|
**包含**: 程序(`src/` `scripts/` `guanlan.py`) · 配置(`configs/`) · 离线安装件(`wheels/win_amd64/` `vendor/python/`)
|
|
|
-· 页面与交付(`release/` `resources/` `reference/`) · **产物**(`outputs/`, 页面取数靠它; 加 `--no-products`
|
|
|
-则不含) · 文档(`docs/` `README_先读我.txt` `测试须知.txt`) · 安装/起停脚本(`install.bat` `install.sh`
|
|
|
-`install.ps1` `check.bat` `start.bat` `stop.bat`) · `requirements.txt`。
|
|
|
+· 页面与交付(`release/` `resources/` `reference/`) · 文档(`docs/` `README_先读我.MD` `测试须知.txt`)
|
|
|
+· 安装/起停/打包脚本(`install.bat` `install.sh` `install.ps1` `check.bat` `start.bat` `stop.bat` `pack.bat`
|
|
|
+`pack.sh`) · `requirements.txt`。
|
|
|
|
|
|
**不含**修复记录/临时目录(`_修复记录_*` 之类): 本包已纳入 git 管理, 变更历史由版本库承载 (2026-09-12 用户令)。
|
|
|
**不含 VBScript**: 2026-09-16 用户令"把 VBScript 替换掉" —— 无窗口启动由 `pythonw.exe` +
|
|
|
`scripts/guanlan_start_hidden.py` 承担, 安装时另建 `启动观澜.lnk`; 包里已无 `.vbs`, 也不依赖 Windows 脚本宿主。
|
|
|
|
|
|
-**排除**(每条都写了理由):
|
|
|
+**排除**(每条都写了理由; 前四类就是用户令点名的四类):
|
|
|
+ data/ ① **输入数据**: 现场原始件(约定"原始件不随包分发"); 要一起交付用 --with-data
|
|
|
+ outputs/ ② **产物(输出数据)**: 页面取数靠它, 但按令不进包 —— 目标机放数据后
|
|
|
+ `scripts/place_raw_data.py` + `scripts/rebuild_all.py` 重算, 或按需从
|
|
|
+ 交付包补齐无生成端的那批(products_restore_missing.py --stash <zip>)
|
|
|
+ logs/ run/ ③ **运行日志与运行态**: 本机日志(含 logs/build、logs/legacy)、run/pids.json
|
|
|
+ (旧 PID 到新机器上是无效引用); 要连产物一起发用 --with-products
|
|
|
+ *.log *.jsonl(任何位置) ③ 运行日志/审计流水的兜底规则: 不管躺在哪都不进包
|
|
|
+ *_cache/ .*_cache/ __pycache__/ ④ **临时文件与缓存**: 解释器缓存、第三方工具缓存
|
|
|
+ .pytest_cache .mypy_cache .ruff_cache .ipynb_checkpoints .npm-cache .qa-profile
|
|
|
+ *.tmp *.temp *.bak* *.old *.orig *.rej *.swp *.swo *~ ~$*
|
|
|
+ ④ 编辑器/工具留下的临时与备份文件
|
|
|
.git/ .venv/ .github/ 版本库与虚拟环境 —— venv 换机必失效, 目标机安装时重建
|
|
|
_products_off*/ 历史遗留的"清除产物"暂存档(2026-09-16 起清除=真删, 不再产生此类目录)
|
|
|
- logs/ run/ 本机日志与 run/pids.json(旧 PID, 到新机器上是无效引用)
|
|
|
- data/raw/ 现场原始件(约定"原始件不随包分发"); 要一起交付用 --with-data
|
|
|
- __pycache__/ *.pyc 解释器缓存
|
|
|
+ *.pyc *.pyo 解释器缓存(字节码)
|
|
|
*.lnk 安装时建的快捷方式(内含绝对路径, 换机必失效; 目标机由 install.ps1 重建)
|
|
|
*.zip(顶层) 旧的交付压缩包; 避免包中包
|
|
|
+ .DS_Store Thumbs.db desktop.ini 其它系统在目录里留下的临时索引
|
|
|
|
|
|
## 用法
|
|
|
|
|
|
python scripts/pack_dist.py --dry-run # 只报会打什么/多大, 不写文件
|
|
|
- python scripts/pack_dist.py # 打包 → <父目录>/guanlan-v<VERSION>_dist_<日期>.zip
|
|
|
- python scripts/pack_dist.py --no-products # **不含产物**(用户令 2026-09-16): 开箱页面显示"无产物"
|
|
|
- python scripts/pack_dist.py --with-data # 连 data/raw 一起打 (30 GB, 慎用)
|
|
|
+ python scripts/pack_dist.py # 打包(默认不含 数据/产物/日志/临时文件)
|
|
|
+ python scripts/pack_dist.py --out <目标 zip> # 指定输出路径
|
|
|
+ python scripts/pack_dist.py --with-products # 例外: 连产物一起打 (页面开箱即有数)
|
|
|
+ python scripts/pack_dist.py --with-data # 例外: 连 data/raw 一起打 (30 GB, 慎用)
|
|
|
+ python scripts/pack_dist.py --no-products # (旧开关, 现在默认就是这个; 保留兼容不报错)
|
|
|
python scripts/pack_dist.py --out D:\out\x.zip # 指定输出 # portability-allow: 只是用法示例里的 Windows 路径写法, 不是本机路径
|
|
|
python scripts/pack_dist.py --verify <zip> # **开箱验证**: 解压 → 离线安装 → 起服务核验页面 → 清理
|
|
|
|
|
|
## 排除结果写进包
|
|
|
|
|
|
-包里 `dist-manifest.json` 记下 version / no_data / no_products / no_logs 与逐条排除理由;
|
|
|
-`guanlan.py check` 读它 —— 打了"不含产物"的包, 产物那几行检查按 `[--]` 说明而不判 FAIL。
|
|
|
+包里 `dist-manifest.json` 记下 version / no_data / no_products / no_logs / no_temp 与**逐条**排除理由;
|
|
|
+`guanlan.py check` 读它 —— 没带产物的包, 产物那几行检查按 `[--]` 说明而不判 FAIL。
|
|
|
+
|
|
|
+一键入口(给不敲命令行的人): Windows 双击 `pack.bat`(或 `pack.bat dry` 只看计划)、Linux/macOS `sh pack.sh`。
|
|
|
"""
|
|
|
from __future__ import annotations
|
|
|
|
|
|
@@ -61,7 +79,7 @@ sys.path.insert(0, str(ROOT))
|
|
|
|
|
|
INCLUDE_DIRS = ['src', 'scripts', 'configs', 'release', 'resources', 'reference', 'docs',
|
|
|
'wheels', 'vendor']
|
|
|
-PRODUCTS_DIR = 'outputs' # 产物仓: 默认打进包 (页面开箱有数); --no-products 时排除
|
|
|
+PRODUCTS_DIR = 'outputs' # 产物仓: **默认不进包** (用户令 2026-09-17); 要带用 --with-products
|
|
|
# ★ 不打包"修复记录/临时/脚手架"类目录 (2026-09-12 用户令): 本包已纳入 git 管理, 变更历史由版本库承载,
|
|
|
# 不必在交付物里再带一份 `_修复记录_<日期>\`。原先这里含 `_修复记录_20260911` (该目录的**内容**已并入
|
|
|
# `docs\振动数据接入_v0.1.md` 与 `docs\数据目录结构与落位约定_v0.2.md`, 目录本身按用户令删除)。
|
|
|
@@ -71,17 +89,26 @@ INCLUDE_FILES = ['guanlan.py', 'install.bat', 'install.ps1', 'install.sh', 'chec
|
|
|
# "无法找到脚本文件 start_hidden.vbs" (2026-09-16 现场反馈)。现已按用户令**把 VBScript
|
|
|
# 整个去掉**: 无窗口启动 = `pythonw.exe` + `scripts/guanlan_start_hidden.py`,
|
|
|
# 安装时另建 `启动观澜.lnk`。这条手工清单仍由 src/entry_refs.py 从引用反推兜底(漏不掉)。
|
|
|
- 'requirements.txt', 'README_先读我.txt', '测试须知.txt']
|
|
|
-EXCLUDE_DIRS = {'.git', '.venv', '.github', 'logs', 'run', '__pycache__'}
|
|
|
+ 'requirements.txt', 'README_先读我.MD', '测试须知.txt',
|
|
|
+ # 打包入口 (用户令 2026-09-17: 把"打包功能"做成双击可用)
|
|
|
+ 'pack.bat', 'pack.sh']
|
|
|
+# 目录排除: 版本库/虚拟环境/日志/运行态/缓存 (名字出现在路径的任何一层都算)
|
|
|
+EXCLUDE_DIRS = {'.git', '.venv', '.github', '.git-*', 'logs', 'run', '__pycache__',
|
|
|
+ '.pytest_cache', '.mypy_cache', '.ruff_cache', '.ipynb_checkpoints',
|
|
|
+ '.cache', '.npm-cache', '.qa-profile', '.Trash', '$RECYCLE.BIN', '.venv.bak'}
|
|
|
# ★ node_modules **不排除**: `release/viewer/node_modules` 里是 esbuild(构建工具)+three(三维库源码), 共 52.5 MB;
|
|
|
# 前端运行期读的是打包好的 viewer.js(three 已 bundle 进去), 理论上可以不发 —— 但**历史交付包是带着它的**
|
|
|
# (实测 guanlan-rudong-v2_0.2.0_test_win64.zip 里就有 1207 条 node_modules 条目),
|
|
|
# 为省 52 MB 去冒"三维页在别人机器上打不开"的风险不划算。宁可多带。
|
|
|
-EXCLUDE_GLOBS = ['_products_off*', 'data']
|
|
|
-# 进包**只**看目录/名的顶部前缀, 这些则按后缀排除 —— 都是"本机/装机时才产生"的东西:
|
|
|
-# .pyc 解释器缓存; .lnk 安装时建的快捷方式(里面是绝对路径, 换机必失效, 由 install.ps1 重建);
|
|
|
-# .zip 顶层旧交付包(避免包中包; 原先只写在文档里, 2026-09-16 补上实现)
|
|
|
-EXCLUDE_SUFFIX = {'.pyc', '.lnk'}
|
|
|
+EXCLUDE_GLOBS = ['_products_off*', 'data', 'outputs']
|
|
|
+# 进包**只**看目录/名的顶部前缀, 这些则按后缀/文件名排除 —— 都是"本机/装机时/编辑时"才产生的东西
|
|
|
+# (用户令 2026-09-17 的"临时文件"与"运行日志"两条就落在这里):
|
|
|
+# .pyc/.pyo 解释器缓存; .lnk 安装时建的快捷方式(绝对路径, 换机失效, 由 install.ps1 重建);
|
|
|
+# .log/.jsonl 运行日志与审计流水 —— **不管躺在哪都不进包**; .tmp/.bak/.old/.orig/.rej/.swp 编辑器临时与备份
|
|
|
+EXCLUDE_SUFFIX = {'.pyc', '.pyo', '.lnk', '.log', '.jsonl',
|
|
|
+ '.tmp', '.temp', '.bak', '.old', '.orig', '.rej', '.swp', '.swo'}
|
|
|
+# 文件名/尾部模式 (glob): 临时与备份的常见写法 + 系统索引文件
|
|
|
+EXCLUDE_NAMES = ('*~', '~$*', '*.bak-*', '.DS_Store', 'Thumbs.db', 'desktop.ini', '*.crdownload', '*.partial')
|
|
|
|
|
|
|
|
|
def _xfer():
|
|
|
@@ -93,25 +120,25 @@ def _xfer():
|
|
|
return m
|
|
|
|
|
|
|
|
|
-def plan(with_data=False, no_products=False):
|
|
|
+def plan(with_data=False, with_products=False):
|
|
|
"""→ (要打包的顶层条目 list, 排除说明 list)
|
|
|
|
|
|
- 2026-09-16 用户令: 打包**不含 输入数据 / 产物 / 日志**。
|
|
|
- · 输入数据 `data/` —— 一直默认排除 (要用 --with-data 才带);
|
|
|
- · 产物 `outputs/` —— 新增 --no-products 排除 (默认仍带: 页面开箱即有数);
|
|
|
- · 日志 `logs/` —— 一直在 EXCLUDE_DIRS 里 (连同 run/ 旧 PID)。
|
|
|
- 排除产物时, 包内 `dist-manifest.json` 会记 `no_products: true`,
|
|
|
- 目标机 `guanlan.py check` 据此把"产物缺失"显示为 `--`(待重算) 而不是 FAIL。
|
|
|
+ ★ 2026-09-17 用户令: 交付包**默认不含 输入数据 / 产物(输出数据) / 运行日志 / 临时文件**。
|
|
|
+ · 输入数据 `data/` —— 默认排除 (--with-data 才带);
|
|
|
+ · 产物 `outputs/` —— 默认排除 (--with-products 才带);
|
|
|
+ · 运行日志 `logs/ run/` 与任何位置的 `*.log`/`*.jsonl` —— 默认排除;
|
|
|
+ · 临时文件 `*_cache/ __pycache__/ *.tmp *.bak* *~ ~$* .DS_Store …` —— 默认排除。
|
|
|
+ 于是"开箱是一套干净程序": 页面显示"无产物", 目标机自己放数据、自己重算 (docs §9 / §12)。
|
|
|
+ 包内 `dist-manifest.json` 记 `no_data/no_products/no_logs/no_temp`, 目标机 `guanlan.py check`
|
|
|
+ 据此把"产物缺失"显示为 `--`(待重算) 而不是 FAIL。
|
|
|
"""
|
|
|
inc = []
|
|
|
for d in INCLUDE_DIRS:
|
|
|
p = ROOT / d
|
|
|
if p.is_dir():
|
|
|
inc.append(p)
|
|
|
- if not no_products:
|
|
|
- p = ROOT / PRODUCTS_DIR
|
|
|
- if p.is_dir():
|
|
|
- inc.append(p)
|
|
|
+ if with_products and (ROOT / PRODUCTS_DIR).is_dir():
|
|
|
+ inc.append(ROOT / PRODUCTS_DIR)
|
|
|
if with_data:
|
|
|
inc.append(ROOT / 'data')
|
|
|
for f in INCLUDE_FILES:
|
|
|
@@ -130,19 +157,26 @@ def plan(with_data=False, no_products=False):
|
|
|
for p in extra:
|
|
|
print(f' [+] 自动补入 (被入口脚本引用): {p.name}')
|
|
|
inc.extend(extra)
|
|
|
- skipped = [('.git/', '版本库'), ('.venv/', '虚拟环境(换机必失效, 目标机安装时重建)')]
|
|
|
+ skipped = [('data/', '① 输入数据 (现场原始件): 用户令不进包; 要一起交付用 --with-data')]
|
|
|
+ if (ROOT / PRODUCTS_DIR).is_dir():
|
|
|
+ skipped += [('outputs/', '② 产物/输出数据: 用户令不进包 (目标机放数据后 place_raw_data.py + '
|
|
|
+ 'rebuild_all.py 重算; 无生成端的那批用 products_restore_missing.py --stash <交付包.zip>)'
|
|
|
+ + ('' if not with_products else ' ※本次给了 --with-products, 例外打进包'))]
|
|
|
+ skipped += [('logs/, run/', '③ 运行日志与运行态 (logs/build、logs/legacy、run/pids.json 旧 PID)')]
|
|
|
+ skipped += [('*.log, *.jsonl (任何位置)', '③ 运行日志/审计流水兜底: 不管躺在哪都不进包')]
|
|
|
_glob_why = {
|
|
|
'_products_off*': '历史遗留的"清除产物"暂存档 (2026-09-16 起清除=真删, 不再产生; 老机器上若有可手工删)',
|
|
|
- 'data': '现场原始输入件 (约定"原始件不随包分发"; 要一起交付用 --with-data) —— 用户令: 输入数据不进包',
|
|
|
+ 'data': '① 输入数据: 现场原始件, 用户令不进包 (--with-data 才带)',
|
|
|
+ 'outputs': '② 产物/输出数据: 用户令不进包 (--with-products 才带)',
|
|
|
}
|
|
|
skipped += [(g + '/', _glob_why.get(g, '本机痕迹/超大体量, 见脚本头部说明')) for g in EXCLUDE_GLOBS]
|
|
|
- skipped += [('logs/, run/', '本机日志与旧 PID —— 用户令: 日志不进包')]
|
|
|
- skipped += [('__pycache__/ *.pyc', '解释器缓存')]
|
|
|
+ skipped += [('*_cache/ __pycache__/ 等', '④ 临时文件与缓存 (解释器/工具缓存: .pytest_cache .npm-cache .qa-profile …)')]
|
|
|
+ skipped += [('*.tmp *.bak* *.old *.orig *.rej *.swp *~ ~$*', '④ 编辑器/工具留下的临时与备份文件')]
|
|
|
+ skipped += [('.DS_Store Thumbs.db desktop.ini', '④ 系统临时索引文件')]
|
|
|
+ skipped += [('.git/ .venv/ .github/', '版本库与虚拟环境 (venv 换机必失效, 目标机安装时重建)')]
|
|
|
+ skipped += [('__pycache__/ *.pyc *.pyo', '字节码缓存')]
|
|
|
skipped += [('*.lnk', '安装时建的快捷方式 (内含绝对路径, 换机必失效; 目标机由 install.ps1 重建)')]
|
|
|
skipped += [('*.zip (顶层)', '旧的交付压缩包; 避免包中包')]
|
|
|
- if no_products and (ROOT / PRODUCTS_DIR).is_dir():
|
|
|
- skipped += [('outputs/', '用户令: 产物不进包 (目标机放数据后 rebuild_all.py 重算; '
|
|
|
- '或在目标机也用 --no-products 的同一口径)')]
|
|
|
return inc, skipped
|
|
|
|
|
|
|
|
|
@@ -152,10 +186,14 @@ def keep(f: pathlib.Path) -> bool:
|
|
|
★ 2026-09-16 修正: 原实现里 `size_of()` 数的是**目录下所有文件**(连 `__pycache__/*.pyc` 一起数),
|
|
|
而实际写入时又跳过它们 ⇒ 预演报的"件数/体积"比包里真的多 (src 少报 100+ 件)。
|
|
|
现在两处都走 `keep()`: 预演数字 = 包里条目数, 对不上就是 bug。
|
|
|
+ ★ 2026-09-17: 加"运行日志(*.log/*.jsonl 任何位置)"与"临时/备份文件"两类排除 (用户令)。
|
|
|
"""
|
|
|
+ import fnmatch
|
|
|
parts = f.relative_to(ROOT).parts
|
|
|
if any(x in EXCLUDE_DIRS for x in parts) or f.suffix.lower() in EXCLUDE_SUFFIX:
|
|
|
return False
|
|
|
+ if any(fnmatch.fnmatch(f.name, pat) for pat in EXCLUDE_NAMES):
|
|
|
+ return False
|
|
|
if len(parts) == 1 and f.suffix.lower() == '.zip': # 顶层旧交付包, 避免包中包
|
|
|
return False
|
|
|
return not any(x.startswith(tuple(g.rstrip('*') for g in EXCLUDE_GLOBS)) for x in parts[:1])
|
|
|
@@ -171,10 +209,11 @@ def size_of(p: pathlib.Path):
|
|
|
return n, s
|
|
|
|
|
|
|
|
|
-def build(out: pathlib.Path, with_data=False, progress=True, no_products=False) -> int:
|
|
|
- inc, skipped = plan(with_data, no_products)
|
|
|
+def build(out: pathlib.Path, with_data=False, progress=True, with_products=False) -> int:
|
|
|
+ inc, skipped = plan(with_data, with_products)
|
|
|
tot_n = tot_s = 0
|
|
|
print('== 要打进包的内容 ==')
|
|
|
+ print(' (默认口径: 不含 输入数据 / 产物 / 运行日志 / 临时文件 —— 用户令 2026-09-17)')
|
|
|
for p in inc:
|
|
|
n, s = size_of(p)
|
|
|
tot_n += n; tot_s += s
|
|
|
@@ -189,12 +228,14 @@ def build(out: pathlib.Path, with_data=False, progress=True, no_products=False)
|
|
|
includes=[p.relative_to(ROOT).as_posix() for p in inc],
|
|
|
excluded={n: w for n, w in skipped}, files=tot_n + 1, # +1 = dist-manifest.json 自身
|
|
|
bytes=tot_s,
|
|
|
- no_data=not with_data, no_products=bool(no_products), no_logs=True,
|
|
|
- note='本包由 scripts/pack_dist.py 生成; **不含 输入数据(data/) · 产物(outputs/) · 日志(logs/, run/)** '
|
|
|
- '(2026-09-16 用户令)。目标机解压后跑 install.bat(Windows) 或 sh install.sh(Linux/macOS), '
|
|
|
- '再 check → start。要让页面有数: 把现场包放好后跑 '
|
|
|
- '`scripts/place_raw_data.py --src <现场包目录> --scope full` + `scripts/rebuild_all.py`。'
|
|
|
- '.venv 不在包内(换机必失效, 安装时重建)。')
|
|
|
+ no_data=not with_data, no_products=not with_products, no_logs=True, no_temp=True,
|
|
|
+ note='本包由 scripts/pack_dist.py 生成 (用户令 2026-09-17): **不含 输入数据(data/) · '
|
|
|
+ '产物(outputs/) · 运行日志(logs/, run/, *.log, *.jsonl) · 临时文件(缓存/备份/系统索引)**。'
|
|
|
+ '目标机解压后跑 install.bat(Windows) 或 sh install.sh(Linux/macOS), 再 check → start; '
|
|
|
+ '要让页面有数: 把现场包放好后跑 `scripts/place_raw_data.py --src <现场包目录> --scope full` '
|
|
|
+ '+ `scripts/rebuild_all.py` (无生成端的那批用 '
|
|
|
+ '`scripts/products_restore_missing.py --stash <交付包.zip>` 补齐)。'
|
|
|
+ '.venv 不在包内(换机必失效, 安装时重建); 打包方法见包内 README_先读我.MD 的「打包」一节。')
|
|
|
t0 = time.time()
|
|
|
with zipfile.ZipFile(out, 'w', zipfile.ZIP_DEFLATED, compresslevel=6) as z:
|
|
|
z.writestr('dist-manifest.json', json.dumps(man, ensure_ascii=False, indent=1))
|
|
|
@@ -312,9 +353,12 @@ def verify(zip_path: pathlib.Path, keep=False) -> int:
|
|
|
def main() -> int:
|
|
|
ap = argparse.ArgumentParser()
|
|
|
ap.add_argument('--out', default=None)
|
|
|
- ap.add_argument('--with-data', action='store_true', help='连 data/raw 一起打(约 31 GB, 慎用)')
|
|
|
+ ap.add_argument('--with-data', action='store_true',
|
|
|
+ help='例外: 连输入数据 data/raw 一起打 (约 31 GB, 慎用; 默认不含)')
|
|
|
+ ap.add_argument('--with-products', action='store_true',
|
|
|
+ help='例外: 连产物 outputs/ 一起打 (页面开箱即有数; 默认不含 —— 用户令 2026-09-17)')
|
|
|
ap.add_argument('--no-products', action='store_true',
|
|
|
- help='**不含产物** (outputs/): 用户令 2026-09-16 "打包不含 输入数据/产物/日志"')
|
|
|
+ help='(旧开关) 不含产物 —— 现在**默认就是这个**, 保留只为兼容旧命令')
|
|
|
ap.add_argument('--dry-run', action='store_true')
|
|
|
ap.add_argument('--verify', default=None, help='对已打好的 zip 做开箱验证(解压→安装→起服务核验)')
|
|
|
ap.add_argument('--keep', action='store_true', help='--verify 后保留解压目录')
|
|
|
@@ -324,7 +368,7 @@ def main() -> int:
|
|
|
out = (pathlib.Path(a.out) if a.out
|
|
|
else ROOT.parent / f'guanlan-v{VERSION}_dist_{time.strftime("%Y%m%d")}.zip')
|
|
|
if a.dry_run:
|
|
|
- inc, skipped = plan(a.with_data, a.no_products)
|
|
|
+ inc, skipped = plan(a.with_data, a.with_products)
|
|
|
tot_n = tot_s = 0
|
|
|
print(f'== 会打进包 (version {VERSION}) ==')
|
|
|
for p in inc:
|
|
|
@@ -336,7 +380,7 @@ def main() -> int:
|
|
|
print(f' {name:26s} {why}')
|
|
|
print('\n(dry-run, 未写文件)')
|
|
|
return 0
|
|
|
- return build(out, a.with_data, no_products=a.no_products)
|
|
|
+ return build(out, a.with_data, with_products=a.with_products)
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|