You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:02:12