Angular13升级后运行e2e测试出现keyword "id"不支持报错如何排查
错误根因
这个报错是Angular13依赖的@angular-devkit/core内置的AJV(JSON Schema校验工具)升级到v8+版本后,不再兼容旧版JSON Schema的id关键字,要求使用符合draft-07规范的$id关键字定义schema ID。ng build正常是因为构建流程没有加载到存在旧schema写法的配置/依赖,只有e2e执行流程触发了对应校验。
排查步骤
- 先核对e2e测试框架相关依赖的适配性,从报错路径可知你使用的是WebdriverIO(wdio)测试框架,优先检查
@wdio/schematics、wdio-angular-builder等Angular相关wdio依赖的版本,确认是否已经发布适配Angular13的版本,旧版本的wdio插件大概率还在使用带id关键字的旧schema配置。 - 检查
angular.json中e2e相关配置,特别是你用到的docker自定义配置下的builder字段、传入的自定义参数,确认是否使用了未适配Angular13的第三方e2e builder,或者自定义的schema配置文件用了id而非$id关键字。 - 排查依赖冲突,删除本地
node_modules目录、package-lock.json或yarn.lock文件后重新执行安装操作,执行npm ls ajv(npm环境)或yarn list ajv(yarn环境)查看所有ajv版本引用,确认是否有其他第三方依赖携带了v6/v7版本的ajv,和@angular-devkit/core内置的v8版ajv产生版本冲突。 - 加日志定位具体触发源,可临时修改报错路径下的
/opt/wdio/node_modules/@angular-devkit/core/node_modules/ajv/dist/vocabularies/core/id.js文件,在抛错逻辑前添加打印语句输出当前校验的schema内容、调用栈,即可直接定位到存在旧写法的schema文件归属。
解决办法
- 若确认是第三方依赖未适配,直接将对应依赖升级到适配Angular13的版本即可解决。
- 若依赖暂未发布适配版本,可在
package.json中添加配置强制ajv兼容旧关键字:npm v8+环境添加overrides字段、yarn环境添加resolutions字段统一指定ajv版本,或者在e2e启动配置中给AJV实例添加keywords: ['id']的配置项,允许识别旧版id关键字。
内容的提问来源于stack exchange,提问作者samneric
相关产品推荐
相关产品推荐

