KotlinJs在Google Cloudbuild运行jsBrowserTest时遇引用错误
KotlinJS jsBrowserTest在Google CloudBuild中出现ReferenceError: setMetadataFor is not defined
问题背景
我们编写了简单的KotlinJS测试,用于验证自定义JS函数能否被Kotlin正确调用。本地运行测试一切正常,但在Google CloudBuild中执行jsBrowserTest任务时,出现以下错误:
ReferenceError: setMetadataFor is not defined
该函数是Kotlin编译器生成的testJs文件中定义的,代码为:
var setMetadataFor = kotlin_kotlin.$_$.t9;
当前使用环境:Kotlin 1.8、Gradle 7.4
相关代码如下:
自定义JS函数
const makeKey = (num) => { return 1000 + num }
Kotlin FFI声明
@JsNonModule external object MyApp { fun makeKey(num: Int): Int }
测试代码
class TestFFI { @Test fun thingsShouldWork() { println(MyApp.makeKey(5)) assertNotNull(MyApp.makeKey(5)) assertEquals(1005, MyApp.makeKey(5)) } }
可能的解决方法
1. 检查Gradle测试任务的打包配置
确保js插件的测试任务正确包含Kotlin运行时及测试相关文件。在build.gradle.kts中添加或调整以下配置:
plugins { kotlin("js") version "1.8.22" } kotlin { js { browser { testTask { useKarma { // 确保测试环境加载所有必要的Kotlin runtime资源 files.setFrom(files, kotlin.js().browser().distributionDirectory) } } } binaries.executable() } }
2. 清理CloudBuild构建缓存
CloudBuild的缓存可能导致依赖或构建产物不完整,在cloudbuild.yaml中添加清理缓存的构建步骤:
steps: - name: 'gradle:7.4-jdk11' entrypoint: 'gradle' args: ['clean', 'jsBrowserTest', '--no-build-cache']
3. 调整测试资源加载顺序
setMetadataFor属于Kotlin runtime的元数据处理函数,可能是测试页面中JS文件加载顺序错误,导致Kotlin runtime未先于测试代码加载。可在Karma配置中强制指定加载顺序,确保kotlin.js和kotlin-test.js优先加载。
4. 升级Gradle或Kotlin版本
Gradle 7.4与Kotlin 1.8的组合可能存在兼容性问题,建议升级Gradle到7.6+(Kotlin 1.8官方推荐的兼容版本),或升级Kotlin到1.8.22等稳定版本后重新构建测试。
内容的提问来源于stack exchange,提问作者willjsporter
相关产品推荐
相关产品推荐

