在Gradle buildSrc和项目之间共享代码

dkqlctbz  于 2023-08-06  发布在  其他
关注(0)|答案(3)|浏览(98)

假设我有一些包含逻辑的类,我想在Gradle构建期间和Java应用程序本身中使用这些逻辑。如何配置Gradle构建以在构建和正在构建的项目之间共享相同的类,例如使用KotlinDSL?

3bygqnnd

3bygqnnd1#

受@breandan的回答启发,我认为这样更好:

apply plugin: 'java' 
dependencies {
    compile files("${project.rootDir}/buildSrc/build/classes/" )
}

字符串

s1ag04yj

s1ag04yj2#

您可以将buildSrc中的共享类添加到您的应用程序类路径中,如下所示:

sourceSets["main"].compileClasspath += files("${project.rootDir}/buildSrc/build/")

字符串
正如@lance-java提到的,你还应该添加一个编译依赖项:

dependencies {
  compile(fileTree("${project.rootDir}/buildSrc/build/"))
}


最后,如果一个类需要使用从org.gradle.api导入的内容,请将这一行添加到dependencies中:

compile(gradleApi())

ssgvzors

ssgvzors3#

除了描述如何通过直接指向共享类来包含共享类的答案之外,我还想展示如何以模块化的方式解决相同的问题。通过使用Gradle模块(composite builds),至少可以获得以下好处:
1.更好的模块化和可重用性:共享类保存在单独的Gradle模块中,可以独立存储和更新(例如,在另一个Git存储库中)。
1.更严格的封装:可以利用Kotlin中internal可见性修改器的特性,不需要知道要共享的源位于何处,不需要以类似sourceSets的方式手动包含资源。
1.改进的性能:不需要为每个要使用的地方编译共享类。
1.在共享类的本地编译和发布工件之间切换的简单性:请参阅相应的Gradle文档。

如何配置?

1.创建3个项目:main-用于主应用,dsl-用于构建脚本,shared-用于共享类。可以使用IDE的向导,只要确保每个创建的项目都是自给自足的(拥有自己的settings.gradle.kts)。
1.确保shared在其settings.gradle.ktsbuild.gradle.kts文件中分配了一些grouprootProject.nameversion。这些属性的设置非常重要,因为我们将使用它们将该项目作为依赖项包含在内。
1.在dslsettings.gradle.kts中添加:

includeBuild("../shared") // points to the root directory of the shared project

在同一个dsl项目中,创建并声明一些插件,这些插件将完成构建脚本的工作。在dsl/src/main/kotlin/内部创建:

class MyPlugin : Plugin<Project> {

    override fun apply(target: Project) {
        // Required build script configurations for the project.
    }

}

dslbuild.gradle.kts中添加:

plugins {
    // ...
    `java-gradle-plugin`
}

gradlePlugin {
    plugins {
        create("my-plugin") {
            id                  = "my-plugin"
            implementationClass = "MyPlugin"
        }
    }
}

// ...

dependencies {
    // Replace with everything has been configured at the second step.
    implementation("group:projectName:version")
}


1.在mainsettings.gradle.kts中添加:

includeBuild("../shared")
includeBuild("../dsl")

mainbuild.gradle.kts中添加:

plugins {
    // ...
    id("my-plugin")
}

// ...

dependencies {
    // Replace with everything has been configured at the second step.
    implementation("group:projectName:version")
}


恭喜您,您已经获得了在构建脚本(dsl)和主应用(main)中使用的共享项目的源!

相关问题