Ubuntu 20.04下Chromium编译失败求助
Chromium构建TypeScript编译错误排查方案
问题场景
按照Chromium官方文档构建流程操作:用fetch --no-history拉取代码,执行文档脚本安装依赖,运行gn gen out/Default生成构建配置后,执行autoninja -C out/Default chrome时出现TypeScript编译错误,已检查依赖安装和gclient sync,仍无法推进构建。
错误信息
$ gn gen out/Default $ autoninja -C out/Default chrome ninja: 进入目录 `out/Default' [218/26862] ACTION //chrome/browser/resources/side_panel/reading_list:build_ts(//build/toolchain/linux:clang_x64) FAILED: gen/chrome/browser/resources/side_panel/reading_list/tsconfig_build_ts.json gen/chrome/browser/resources/side_panel/reading_list/build_ts.manifest gen/chrome/browser/resources/side_panel/reading_list/tsc/app.js gen/chrome/browser/resources/side_panel/reading_list/tsc/app.d.ts gen/chrome/browser/resources/side_panel/reading_list/tsc/reading_list_item.js gen/chrome/browser/resources/side_panel/reading_list/tsc/reading_list_item.d.ts gen/chrome/browser/resources/side_panel/reading_list/tsc/reading_list_api_proxy.js gen/chrome/browser/resources/side_panel/reading_list/tsc/reading_list_api_proxy.d.ts gen/chrome/browser/resources/side_panel/reading_list/tsc/app.html.js gen/chrome/browser/resources/side_panel/reading_list/tsc/app.html.d.ts gen/chrome/browser/resources/side_panel/reading_list/tsc/reading_list_item.html.js gen/chrome/browser/resources/side_panel/reading_list/tsc/reading_list_item.html.d.ts gen/chrome/browser/resources/side_panel/reading_list/tsc/icons.html.js gen/chrome/browser/resources/side_panel/reading_list/tsc/icons.html.d.ts gen/chrome/browser/resources/side_panel/reading_list/tsc/reading_list.mojom-webui.js gen/chrome/browser/resources/side_panel/reading_list/tsc/reading_list.mojom-webui.d.ts python3 ../../tools/typescript/ts_library.py --root_dir gen/chrome/browser/resources/side_panel/reading_list/preprocessed --gen_dir gen/chrome/browser/resources/side_panel/reading_list --out_dir gen/chrome/browser/resources/side_panel/reading_list/tsc --output_suffix build_ts --in_files app.ts reading_list_item.ts reading_list_api_proxy.ts app.html.ts reading_list_item.html.ts icons.html.ts reading_list.mojom-webui.js --definitions ../../../../../../../../tools/typescript/definitions/metrics_private.d.ts --deps ../../../../../third_party/polymer/v3_0/tsconfig_library.json ../../../../../ui/webui/resources/tsconfig_library.json ../../../../../ui/webui/resources/mojo/tsconfig_library.json --tsconfig_base ../../../../../../../../chrome/browser/resources/side_panel/reading_list/tsconfig_base.json --composite --path_mappings chrome://resources/cr_components/managed_footnote/managed_footnote.js|../../../../../ui/webui/resources/preprocessed/cr_components/managed_footnote/managed_footnote.d.ts chrome://resources/cr_components/managed_dialog/managed_dialog.js|../../../../../ui/webui/resources/preprocessed/cr_components/managed_dialog/managed_dialog.d.ts chrome://resources/*|../../../../../ui/webui/resources/preprocessed/* //resources/*|../../../../../ui/webui/resources/preprocessed/* chrome://resources/polymer/v3_0/*|../../../../../../../../third_party/polymer/v3_0/components-chromium/* //resources/polymer/v3_0/*|../../../../../../../../third_party/polymer/v3_0/components-chromium/* chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js|../../../../../../../../third_party/polymer/v3_0/components-chromium/polymer/polymer.d.ts //resources/polymer/v3_0/polymer/polymer_bundled.min.js|../../../../../../../../third_party/polymer/v3_0/components-chromium/polymer/polymer.d.ts /tools/typescript/definitions/*|../../../../../../../../tools/typescript/definitions/* Traceback (most recent call last): File "../../tools/typescript/ts_library.py", line 220, in <module> main(sys.argv[1:]) File "../../tools/typescript/ts_library.py", line 183, in main node.RunNode([ File "/home/boram/work/chromium/src/out/Default/../../third_party/node/node.py", line 34, in RunNode raise RuntimeError('命令 \'%s\' 执行失败\n%s' % (' '.join(cmd), err)) RuntimeError: 命令 '/home/boram/work/chromium/src/out/Default/../../third_party/node/linux/node-linux-x64/bin/node /home/boram/work/chromium/src/out/Default/../../third_party/node/node_modules/typescript/bin/tsc --project gen/chrome/browser/resources/side_panel/reading_list/tsconfig_build_ts.json' 执行失败 gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:16:57 - 错误 TS2792: 找不到模块 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js'。是否要将 'moduleResolution' 选项设置为 'node',或者在 'paths' 选项中添加别名? 16 import {HelpBubbleMixin, HelpBubbleMixinInterface} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js'; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:108:12 - 错误 TS4113: 此成员不能使用 'override' 修饰符,因为它未在基类 'any' 中声明。 108 override connectedCallback() { gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:126:14 - 错误 TS4111: 属性 'root' 来自索引签名,因此必须使用 ['root'] 访问。 126 this.root!, MARKED_AS_READ_UI_EVENT, this.onMarkedAsRead.bind(this)); ~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:129:12 - 错误 TS4113: 此成员不能使用 'override' 修饰符,因为它未在基类 'any' 中声明。 129 override disconnectedCallback() { ~~~~~~~~~~~~~~~~~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:138:10 - 错误 TS4111: 属性 'unregisterHelpBubble' 来自索引签名,因此必须使用 ['unregisterHelpBubble'] 访问。 138 this.unregisterHelpBubble(READING_LIST_UNREAD_ELEMENT_ID); ~~~~~~~~~~~~~~~~~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:140:47 - 错误 TS4111: 属性 'root' 来自索引签名,因此必须使用 ['root'] 访问。 140 this.readingListEventTracker_.remove(this.root!, MARKED_AS_READ_UI_EVENT); ~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:143:12 - 错误 TS4113: 此成员不能使用 'override' 修饰符,因为它未在基类 'any' 中声明。 143 override ready() { ~~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:146:10 - 错误 TS4111: 属性 'registerHelpBubble' 来自索引签名,因此必须使用 ['registerHelpBubble'] 访问。 146 this.registerHelpBubble( ~~~~~~~~~~~~~~~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:152:20 - 错误 TS4111: 属性 'root' 来自索引签名,因此必须使用 ['root'] 访问。 152 this.root!.querySelector('.unread-item') as HTMLElement | null; ~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:154:18 - 错误 TS4111: 属性 'registerHelpBubble' 来自索引签名,因此必须使用 ['registerHelpBubble'] 访问。 154 this.registerHelpBubble( ~~~~~~~~~~~~~~~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:265:10 - 错误 TS4111: 属性 'notifyHelpBubbleAnchorCustomEvent' 来自索引签名,因此必须使用 ['notifyHelpBubbleAnchorCustomEvent'] 访问。 265 this.notifyHelpBubbleAnchorCustomEvent( ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:308:49 - 错误 TS2345: 类型 'typeof ReadingListAppElement' 的参数不能赋给类型 'CustomElementConstructor' 的参数。 类型 'ReadingListAppElement' 缺少类型 'HTMLElement' 中的以下属性: accessKey, accessKeyLabel, autocapitalize, dir,以及另外277个属性。 308 customElements.define(ReadingListAppElement.is, ReadingListAppElement); ~~~~~~~~~~~~~~~~~~~~~ ../../third_party/node/node_modules/typescript/lib/lib.dom.d.ts:4530:101 - 错误 TS2344: 类型 'HTMLElementTagNameMap[K]' 不满足约束 'Element'。 类型 'HTMLTemplateElement | HTMLElement | HTMLSlotElement | DomModule | HTMLStyleElement | PaperRippleElement | ... 74 more ... | HTMLUListElement' 不能赋给类型 'Element'。 类型 'ReadingListAppElement' 缺少类型 'Element' 中的以下属性: attributes, classList, className, clientHeight,以及另外160个属性。 4530 getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>; ~~~~~~~~~~~~~~~~~~~~~~~~ ../../third_party/node/node_modules/typescript/lib/lib.dom.d.ts:4818:101 - 错误 TS2344: 类型 'HTMLElementTagNameMap[K]' 不满足约束 'Element'。 类型 'HTMLTemplateElement | HTMLElement | HTMLSlotElement | DomModule | HTMLStyleElement | PaperRippleElement | ... 74 more ... | HTMLUListElement' 不能赋给类型 'Element'。 4818 getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>; ~~~~~~~~~~~~~~~~~~~~~~~~ ../../third_party/node/node_modules/typescript/lib/lib.dom.d.ts:10170:87 - 错误 TS2344: 类型 'HTMLElementTagNameMap[K]' 不满足约束 'Node'。 类型 'HTMLTemplateElement | HTMLElement | HTMLSlotElement | DomModule | HTMLStyleElement | PaperRippleElement | ... 74 more ... | HTMLUListElement' 不能赋给类型 'Node'。 类型 'ReadingListAppElement' 缺少类型 'Node' 中的以下属性: baseURI, childNodes, firstChild, isConnected,以及另外46个属性。 10170 querySelectorAll<K extends keyof HTMLElementTagNameMap>(selectors: K): NodeListOf<HTMLElementTagNameMap[K]>; ~~~~~~~~~~~~~~~~~~~~~~~~ 在2个文件中发现15个错误。 错误数 文件 12 gen/chrome/browser/resources/side_panel/reading_list/preprocessed/app.ts:16 3 ../../third_party/node/node_modules/typescript/lib/lib.dom.d.ts:4530
错误分析
所有错误的根源是找不到help_bubble_mixin.js模块,导致TypeScript无法正确识别组件的基类类型,进而引发后续的override修饰符、属性访问方式、自定义元素类型匹配等一系列派生错误。
解决步骤
1. 重新同步完整代码与依赖
执行以下命令确保所有子模块和预生成资源文件同步到位:
gclient sync --with_branch_heads --with_tags
2. 清理并重建构建配置
# 清理旧构建目录 gn clean out/Default # 重新生成构建配置 gn gen out/Default
3. 生成缺失的预处理资源文件
如果ui/webui/resources/preprocessed/cr_components/help_bubble/目录不存在,执行Grit工具生成预处理资源:
tools/grit/grit.py build
4. 验证依赖版本匹配
Chromium构建依赖代码库内置的Node.js和TypeScript版本,禁止使用系统版本,执行以下命令确认版本合规:
# 检查Node.js版本 ./third_party/node/linux/node-linux-x64/bin/node --version # 检查TypeScript版本 ./third_party/node/node_modules/typescript/bin/tsc --version
5. 增量修复构建
删除出错模块的预生成文件,让构建系统重新生成:
rm -rf out/Default/gen/chrome/browser/resources/side_panel/reading_list/ # 重新执行构建 autoninja -C out/Default chrome
内容的提问来源于stack exchange,提问作者cocobang
相关产品推荐
相关产品推荐

