Skip to content

fix(desktop): 构建树里的任务按声明的范围运行,不再以工作区请求项目任务 - #1874

Merged
xiaoyumuxi merged 3 commits into
previewfrom
fix/desktop-build-task-scope
Nov 13, 2026
Merged

xiaoyumuxi merged 3 commits into
previewfrom
fix/desktop-build-task-scope

Conversation

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

关联 Issue / Linked issue

PR 类型 / Type

  • fix:缺陷修复

改动说明 / What changes

背景 / Why

在右侧 Build 窗口展开 Go Modules → 任务,运行 "Vet verification",Run 窗口报错:

plugin.build.invalidSelection: The task vet does not run on the workspace.

vet 只声明了 project 范围。树里的任务行不带项目,运行时原样传入窗口当前的项目和目标(都为空),Core 按"有目标用目标,否则有项目用项目,否则用工作区"判定范围,于是把它当作工作区请求拒绝了。模型任务(Model.Tasks)也有同样的问题:Core 要求模型任务带上所属项目,空选择同样会失败。

改动 / Changes

从树上运行任务时推断范围(build.go)

  • runSelectedBuildTask:
    • 模型任务用它所属的项目,不带目标。
    • 声明任务交给新的 buildTaskSelection 推断;推断不出时提示"请先选择此任务可以运行的项目或目标。",不发请求。
  • buildTaskSelection 按任务声明的范围(Scopes)和目标标签(TargetTags)依次尝试:
    1. 选中的目标:任务声明了 target,且目标的标签匹配(TargetTags 为空时匹配任意目标)。
    2. 选中的项目,或选中目标所在的项目:任务声明了 project。
    3. 工作区:任务声明了 workspace。
    4. 没选项目时:路径为 . 的构建根目录项目,否则唯一的项目。
    5. 没选目标时:唯一适用的目标(选了项目时只在该项目里找);有多个时不猜。
    6. 选中的目标已经不在模型里时原样保留,由 runBuildTask 报告。
  • runBuildTask 不变。IDE API(ide_api_dispatch.go)直接调用它,仍按请求原样交给 Core 校验,不做推断。

任务分组按项目过滤(build_tree.go)

  • 选中项目时,任务分组只列出这个项目的模型任务,和目标的过滤方式一致;之前会把其他项目的模型任务也列在这里。

让 #1873 新增的关闭页签测试稳定(close_tab_shortcut_test.go)

  • rebase 到最新 preview 后,TestCloseTabShortcutClosesTheSelectedEditorTab 在整包测试里失败过一次(close_tab_shortcut_test.go:85: the chord did not close the file's tab)。单独连跑 3 次都通过。
  • 原因:关闭一个没有改动的文件时,checkBeforeClose 先在后台检查磁盘,结果回来后才移除页签。测试在第二次按快捷键后只 settle() 一次就断言,机器忙的时候等不到结果。
  • 修改:改用同一文件里终端测试已经在用的 awaitDocumentState(期限 8 秒)等待页签关闭。产品代码不变。

文案与矩阵

  • 新增词条 desktop.build.chooseTaskScope(中英),已运行 generate-i18n.mjs 并提交生成结果。
  • build-system-plugins.json 的 verification 追加了这次的规则和测试。

不在本 PR 范围内 / Out of scope


类型专属:fix

复现与根因

  • 复现步骤、实际结果、期望结果:
    • 复现:打开含 Go 模块的工作区,在右侧 Build 窗口展开 Go Modules → 任务,选中 "Vet verification",点击运行;不要先选项目。
    • 实际:Run 窗口报 plugin.build.invalidSelection: The task vet does not run on the workspace.
    • 期望:在该模块的项目上运行 vet。
  • 根因:
  • 影响平台:macOS 和 Windows 共用 desktop/ 代码,两端都受影响,本 PR 两端一并修复。

检查项

  • 已先写回归测试,确认它在修复前失败、修复后通过:
    • 测试:desktop/internal/workbench/build_tree_test.go 的 TestBuildTreeTasksRunOnTheScopeTheyDeclare。
    • 把 runSelectedBuildTask 临时改回原样传入选择后,失败输出为:
      build_tree_test.go:408: the project task asked for {Root:app ... Project:<nil> Target:<nil> ModelTask:<nil> Task:vet ...}
      
    • 恢复修复后通过。另有 TestBuildTaskSelectionFitsDeclaredScopes 的 15 个表格用例覆盖推断顺序。
  • [N/A] 无法自动化:已自动化。
  • 已搜索被修改函数的全部调用方:
    • runSelectedBuildTask 的调用方:树的工具栏运行按钮(buildChosenAction)、行内运行按钮(build_tree_view.go)、右键菜单(build_menus.go)、命令 run.selected(commands.go)、official_cargo_test.go。它们都经过新的推断。
    • Cargo 的 build 任务只设置 taskID,推断后仍是工作区或根项目,行为不变。
    • IDE API 调用 runBuildTask,不经过推断。
    • 插件、SDK 和脚本不调用这些 Go 函数。
  • 另一平台:共用同一份 desktop/ 代码,已一并修复。
  • 只改了修复所需的代码。另外改了 fix(desktop): LSP 日志改为普通编辑器页签,⌘W 关闭选中页签(仅 macOS 默认) #1873 的一个关闭页签测试,它在整包测试里会偶发失败(见上)。修复过程中发现的 Core 扫描问题写在"不在本 PR 范围内"。
  • Bug-fix Note:没有写。推断规则写在 buildTaskSelection 的注释、功能矩阵和回归测试里;[Feature] 将 Viva 构建窗口与结构窗口的树投影、筛选和展开规则下沉到 Rust Core #1866 会把它下沉到 Core。

范围检查 / Scope checks

功能矩阵 / Feature matrix

  • 已更新 shared/platform-feature-matrix/features/build-system-plugins.json 的 verification;真实插件组合与 Windows 实机仍记为待验收
  • 已运行 verify-platform-feature-matrix.sh 和 verify-platform-feature-matrix-change.sh origin/preview HEAD,都通过
  • 没有提交 .artifacts/ 下的矩阵视图

统一日志系统 / Structured logging

N/A:没有新增或改动生命周期、终态和失败路径的日志。推断不出范围时只弹提示,不开始操作;任务仍走已有的 beginBuildOperation/finishBuildTask。

界面文案 / i18n

  • 新增的提示走 shared/i18n/,中英词条已补齐,已运行 generate-i18n.mjs 并提交生成结果
  • verify-app-language-localization.mjs 和 generate-i18n.mjs --check 都通过(11070/11070),没有放宽脚本

逻辑归属 / Logic placement

性能与内存 / Performance and memory

N/A:只在点击运行时遍历一次已加载模型的项目和目标,不新增后台任务、进程或缓存。

设置 / Settings

N/A:没有新增或修改设置项。

插件契约 / Plugin contract

N/A:没有改动契约、宿主方法或通知。

发行包与资源 / Bundle and resources

  • 运行时不写入发行目录;已运行 verify-runtime-bundle-immutability.sh,通过
  • [N/A] 资源复用清单:没有新增资源

无用代码与重构 / Dead code and refactoring


验证 / Verification

命令或操作 平台 结果
scripts/desktop/desktop-go.sh test ./internal/workbench ./internal/i18n -count=1(rebase 到最新 preview 之后) macOS 第一次 TestCloseTabShortcutClosesTheSelectedEditorTab 失败(见上);改用有界等待后重跑通过(workbench 138.6s)
.agents/skills/write-stable-tests/scripts/test-stability-macos.sh --package ./internal/workbench -- --filter 'TestCloseTabShortcut' macOS 通过:ClosesTheSelectedEditorTab 310ms,ClosesTheFocusedTerminal 90ms
scripts/desktop/desktop-go.sh test ./internal/workbench -run 'TestBuildTaskSelectionFitsDeclaredScopes|TestBuildTreeTasksRunOnTheScopeTheyDeclare' -v;临时恢复旧行为时失败(见上) macOS 通过
scripts/desktop/desktop-go.sh vet ./internal/workbench ./internal/i18n、gofmt macOS 通过
node scripts/i18n/verify-app-language-localization.mjs、node scripts/i18n/generate-i18n.mjs --check macOS 通过
verify-platform-feature-matrix.sh、verify-platform-feature-matrix-change.sh origin/preview HEAD macOS 通过
scripts/desktop/verify/verify-runtime-bundle-immutability.sh macOS 通过

未能执行的检查和原因:

  • Windows 实机:当前机器是 macOS,没有执行。
  • 真实 Go 插件的整机验收:没有启动应用,用无头测试中声明 project 范围的 vet 任务复现并验证。

提交前确认 / Final checks

  • 分支从最新的 preview 创建并已 rebase;目标分支是 preview
  • 以 Draft 提交
  • 没有无关改动,没有提交产物、凭据或个人路径
  • 本次只运行了无头测试,没有启动 Lithe 应用,也没有进程残留

构建树的任务行不带项目,运行时原样传入窗口当前的项目和目标,空选择被 Core 当成工作区请求,只声明 project 范围的任务(如 Go 的 vet)报 plugin.build.invalidSelection;模型任务也没带上所属项目。

- runSelectedBuildTask:模型任务用它所属的项目;声明任务由 buildTaskSelection 按声明的范围推断项目或目标,推断不出时提示先选择。
- 选中项目时,构建树的任务分组只列出这个项目的模型任务。
- 新增词条 desktop.build.chooseTaskScope。
- IDE API 仍走严格的 runBuildTask,行为不变。
关闭没有改动的文件时,checkBeforeClose 先在后台检查磁盘,回来后才移除页签。测试只 settle 一次就断言,整包测试里机器忙时会偶发失败;改用 awaitDocumentState 有界等待。
@ghfind-review ghfind-review Bot added the review: high ghfind author score; see https://ghfind.com label Nov 13, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review November 13, 2026 18:17
@xiaoyumuxi
xiaoyumuxi merged commit d1e20c8 into preview Nov 13, 2026
5 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: high ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant