Gradle生成中Kotlin扩展函数的未解析引用

Gradle生成中Kotlin扩展函数的未解析引用,gradle,extension-methods,kotlin,Gradle,Extension Methods,Kotlin,我有一个多项目的Gradle构建,所有代码都是用Kotlin编写的。其中有两个项目:common和client。子项目位于中间文件夹中,如“demo”。因此,文件夹结构是: project demo client build.gradle common build.gradle build.gradle gradle.properties settings.gradle settings.gradle: rootProject.name

我有一个多项目的Gradle构建,所有代码都是用Kotlin编写的。其中有两个项目:common和client。子项目位于中间文件夹中,如“demo”。因此,文件夹结构是:

project
  demo
    client
      build.gradle
    common
      build.gradle
  build.gradle
  gradle.properties
  settings.gradle
settings.gradle:

rootProject.name = 'demo'

include 'demo/client'
include 'demo/common'
客户端依赖于公共项目
编译项目(“:demo/common”)
。在公共项目中有一个扩展功能:

fun <T> List<Future<T>>.getAll(): Long {
    var count = 0L
    this.forEach {
        it.get()
        count++
    }
    return count
}
同时,如果我将
getAll
声明放在客户机项目中,那么一切都可以正常编译。我很确定函数的导入是正确的,但同时我对Gradle有一些经验,所以可能会遗漏一些东西

  • 构建:
    gradlew干净构建
  • 科特林:1.0.2
  • 格拉德尔:2.9

UPD:问题出在文件夹结构中(或者可能是我声明的依赖项错误…)-如果我删除中间文件夹,演示一切正常。

检查是否在root
设置中包含这两个项目。gradle

检查最小的工作设置

设置。渐变

rootProject.name = 'demo'

include 'client'
include 'common'
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    }
}

subprojects {
    apply plugin: 'kotlin'

    repositories {
        jcenter()
        maven {
            url "http://repository.jetbrains.com/all"
        }
    }

    dependencies {
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
    }
}
构建.渐变

rootProject.name = 'demo'

include 'client'
include 'common'
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    }
}

subprojects {
    apply plugin: 'kotlin'

    repositories {
        jcenter()
        maven {
            url "http://repository.jetbrains.com/all"
        }
    }

    dependencies {
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
    }
}
common/src/main/kotlin/by/dev/madhead/demo/common/Funktions.kt

package by.dev.madhead.demo.common

fun String.revert(): String {
    return this.reversed()
}
package by.dev.madhead.demo.client

import by.dev.madhead.demo.common.revert

fun main(args: Array<String>) {
    println("Hello".revert())
}
客户端/构建.gradle

dependencies {
    compile project(':common')
}
client/src/main/kotlin/by/dev/madhead/demo/client/App.kt

package by.dev.madhead.demo.common

fun String.revert(): String {
    return this.reversed()
}
package by.dev.madhead.demo.client

import by.dev.madhead.demo.common.revert

fun main(args: Array<String>) {
    println("Hello".revert())
}
package by.dev.madhead.demo.client
由.dev.madhead.demo.common.revert导入
趣味主线(args:Array){
println(“Hello”.revert())
}

好的,问题出在gradle.settings中包含的错误子项目中。应该是

include 'demo:common'
include 'demo:client'
而不是

include 'demo/common'
include 'demo/client'

然后对于依赖项
编译项目(“:demo:common”)

仍然没有成功。如果扩展位于客户机子项目中,然后在客户机子项目中移动它时中断,则所有内容都可以正常编译。这两个子项目都包含在settings.gradle中。Upd:但是在你的设置中一切都很好-我应该检查一下是否有任何差异。问题在于项目的结构。我在项目中有一个中间文件夹(比如“demo”),其中有common和client文件夹。更新了问题以反映这一事实。神奇的
clean
/
build
为我解决了这个问题