Skip to content

check-i18n-coverage 也是「声明了但没强制」的构建前置 —— 未构建时抛未捕获异常,并把成因指向 examples/app-crm 的配置 #5862

Description

@os-zhuang

观察类发现(finding,不入 pm:queue)。在实现 #5217scripts/check-i18n-bundles.mjs 加构建前置判定)时撞到同一族的第四个站点,与该单实现无关、文件面也不同,按 Prime Directive #10 只记录不顺手修。

现象

scripts/check-i18n-coverage.mjs#5217 修的那个门禁是 lint.yml紧邻的两步Check generated translation bundles…Check no new untranslated declared labels),并且带着同一句声明式前置:

  • scripts/check-i18n-coverage.mjs:31// Requires the workspace build (it runs the built CLI), so it belongs after the …
  • scripts/check-i18n-coverage.mjs:42const CLI = 'packages/cli/bin/run.js';

同样只是注释,没有检查。在装完依赖但未构建的 worktree 里(packages/cli/dist 缺失)跑 node scripts/check-i18n-coverage.mjs

file:///home/user/objectstack-issue-5217/scripts/check-i18n-coverage.mjs:101
    if (!raw.trim()) throw new Error(`os lint produced no output for ${configPath}`);
                           ^
Error: os lint produced no output for examples/app-crm/objectstack.config.ts
    at countI18nIssues (…/check-i18n-coverage.mjs:101:28)
    at …/check-i18n-coverage.mjs:118:25
Node.js v22.22.2

退出码 1。

#5217 的关系:同类不同形

#5217 那边是「一个原因报成九个结果」;这边是一个未捕获异常 + 一段 node 栈,并且那句话把读者的注意力指向 examples/app-crm/objectstack.config.ts —— 一个完全无辜的示例配置。真实成因同样只有一个:跑的是构建产物 packages/cli/bin/run.js(oclif 从 dist/commands 解析命令),CLI 没 build 时 os lint 什么也没输出。

家族里已有的三条:#5217check-i18n-bundles,devx,本人 PR 在飞)、#5795(根 dev 入口)、#5794(datasource fail-fast 不认识该成因)。本条是第四个站点,不落在前三条任何一条的完成范围内(#5217 的文件面被派发词明确限定为 check-i18n-bundles.mjs 一个文件),故独立立单,不作子单,也不构成 Blocked-by

建议方向(实现者自选)

#5217 落地的形状同构即可:进入 per-config 循环之前一次前置判定 + 失败时一句修法(pnpm exec turbo run build --filter=@objectstack/cli),而不是让第一个 config 抛异常。#5217 的 PR 里那个判定是纯函数 + --self-test 语料的形式(oclifCommandFileFor 从 CLI 自己的 oclif.commands.target 推导产物路径 + looksLikeMissingCliCommand 认 oclif 的换行签名),可以直接照抄同一形状;注意 oclif 会把那句 command … not found 硬换行成两三行,逐行正则匹配不到。

影响面

纯内部工具链 DX。CI 永远命中不到(构建步骤在这两个门禁之前,见 lint.ymlBuild workspace packages),今天没有人因此拿到错误结果;坏的只是本地/worktree 复现 i18n CI 时的首个诊断步骤。故按观察类归档,交由 PM 定级。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions