JS模块在Kotlin跨平台项目上构建失败

时间:2018-12-02 15:03:19

标签: kotlin kotlin-multiplatform kotlin-js

构建失败,并显示错误消息:

  

./ output.js模块中未找到错误:错误:无法解析“ common”   在'C:\ Users \ User \ Documents \ MultiPlatformTodo \ web \ web'@ ./output.js中   340:91-108

     

./ output.js模块中未找到错误:错误:无法解析'kotlin'   在'C:\ Users \ User \ Documents \ MultiPlatformTodo \ web \ web'@ ./output.js中   340:18-35

     ./output.js中的

ERROR找不到模块:错误:无法解决   'C:\ Users \ User \ Documents \ MultiPlatformTodo \ web \ web'中的'kotlin-react'   @ ./output.js 340:37-60

     ./output.js中的

ERROR找不到模块:错误:无法解决   'kotlin-react-dom'在   'C:\ Users \ User \ Documents \ MultiPlatformTodo \ web \ web'@ ./output.js   340:62-89

     ./output.js中的

ERROR找不到模块:错误:无法解决   'kotlinx-coroutines-core'在   'C:\ Users \ User \ Documents \ MultiPlatformTodo \ web \ web'@ ./output.js   340:110-144

     ./output.js中的

ERROR找不到模块:错误:无法解决   'kotlinx-html-js'在   'C:\ Users \ User \ Documents \ MultiPlatformTodo \ web \ web'@ ./output.js   340:146-172

     

失败:构建失败,并出现异常。

     
      
  • 出了什么问题:任务':web:webpack-bundle'的执行失败。   节点webpack.js失败(退出代码= 2)
  •   

Js模块build.gradle的定义如下:

apply plugin: 'org.jetbrains.kotlin.frontend'
apply plugin: 'kotlin2js'

kotlinFrontend {
    npm {
        dependency("react", "16.6.0")
        dependency("react-dom", "16.6.0")
        dependency("@material-ui/core", "1.4.3")
    }

    sourceMaps = true

    webpackBundle {
        bundleName = "mpnotes"
        contentPath = file('src/main/web')
    }
}

dependencies {
    implementation project(':common')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-html-js:0.6.11"
    implementation "org.jetbrains:kotlin-react:16.6.0-pre.61-kotlin-1.3.0"
    implementation "org.jetbrains:kotlin-react-dom:16.6.0-pre.61-kotlin-1.3.0"
}

compileKotlin2Js {
    kotlinOptions {
        outputFile = "${projectDir}/web/output.js"
        metaInfo = true
        moduleKind = "commonjs"
        sourceMap = true
    }
}

settings.gradle

enableFeaturePreview('GRADLE_METADATA')

rootProject.name = 'MultiPlatformTodo'
include 'android'
include 'web'
include 'common'

这是common模块的内容:

apply plugin: 'kotlin-multiplatform'

kotlin {
    targets {
        fromPreset(presets.jvm, 'jvm')
        fromPreset(presets.js, 'js')
    }

    sourceSets {
        commonMain {
            dependencies {
                implementation 'org.jetbrains.kotlin:kotlin-stdlib-common'
                implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version"
            }
        }

        commonTest {
            dependencies {
                implementation "org.jetbrains.kotlin:kotlin-test-common"
                implementation "org.jetbrains.kotlin:kotlin-test-annotations-common"
            }
        }

        jvmMain {
            dependencies {
                implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
                implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
            }
        }

        jsMain {
            dependencies {
                implementation "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
                implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-js:$coroutines_version"
            }
        }
    }
}

kotlin {
    experimental {
        coroutines "enable"
    }
}

2 个答案:

答案 0 :(得分:1)

我看到两个可能的问题。

第一个是,您应该使用多平台gradle插件而不是kotlin2js,即kotlin-multiplatform,它是较新的并且将提供更多的长期支持,或者是kotlin-platform-js,这可能是可以轻松替换当前设置。

另一个问题是第implementation project(':common')行。这告诉gradle您将普通模块作为js依赖项使用,因为这是一个js项目。对于kotlin-platform-js,您应该改用expectedBy project(':common')将其链接为公共依赖项。对于kotlin-multiplatform,您需要对依赖项配置进行大量更改。您可以查看一些详细信息here

答案 1 :(得分:0)

我知道有点晚了,但是如果您在apply plugin: 'kotlin-dce-js'中添加build.gradle,那就很好了