方案缓冲区子模块的Gradle设置

ryoqjall  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(103)

我正在尝试构建一个GIT仓库来存储公共协议缓冲区,我正在尝试做的是最小化不同项目中的公共样板代码。
我认为类似于下面的结构,因此,当一个应用程序包含我的源代码作为“git子模块”时,它只能包含“必要的proto +语言”。

rootProject
  |-- proto-1
  |     |--src
  |     |   |-- main
  |     |         |-- proto
  |     |               |-- proto-a.proto
  |     |               `-- proto-a.proto
  |     |-- Java
  |     |     |-- build.gradle.kts
  |     |-- Kotlin
  |     |     |-- build.gradle.kts  
  |     |-- JavaScript
  |           |-- build.gradle.kts
  |-- proto-2
  |     |--src
  |     |   |-- main
  |     |         |-- proto
  |     |               |-- proto-c.proto
  |     |               `-- proto-d.proto
  |     |-- Java
  |     |     |-- build.gradle.kts
  |     |-- Python
  |     |     |-- build.gradle.kts  
  |---- settings.gradle
  `---- build.gradle.kts

如果我为每个build.gradle.kts定义protobuf和sourceSets,上面的代码可以很好地工作,例如

protobuf {
    generateProtoTasks {
        all().forEach {
            it.builtins {
                id("kotlin")
            }
        }
    }
}
sourceSets {
    main {
        proto {
            srcDir("../src/main/proto")
        }
    }
}

但是,正如您所看到的,上述代码在build.gradle.kts中重复。如果我可以在根页面build.gradle.kts中设置上述代码,我认为使用起来会非常简单。
这是我当前根项目的build.gradle.kts。(当然,这是不完整的)
一个二个一个一个

sqyvllje

sqyvllje1#

这是Gradle convention plugins的使用情形。
您可以在included buildsbuildSrc中定义它们。

├── buildSrc
│   ├── build.gradle.kts
│   ├── settings.gradle.kts
│   ├── src
│   │   ├── main
│   │   │   └── kotlin
│   │   │       ├── myproject.protobuf.gradle.kts
// buildSrc/build.gradle.kts
plugins {
    `kotlin-dsl`
}

repositories {
    gradlePluginPortal() // so that external plugins can be resolved in dependencies section
}

dependencies {
    implementation("com.google.protobuf:protobuf-gradle-plugin:0.9.2") //depend on the protobuf plugin
}

使用常规的buildscript语法,将那些使用protobuf的项目中需要的所有逻辑移到约定插件中。

// buildSrc/src/main/kotlin/myproject.protobuf.gradle.kts
plugins {
   java
   id("com.google.protobuf") 
}

repositories {
    maven {
        setUrl("https://nexus.yanolja.in/repository/maven-public/")
    }
}

protobuf {
    protoc { artifact = "com.google.protobuf:protoc:3.22.0" }
}

dependencies {
    implementation("com.google.protobuf:protobuf-java:3.22.0")
}

val mainSource = project.the<SourceSetContainer>().findByName(SourceSet.MAIN_SOURCE_SET_NAME)
mainSource?.allSource?.srcDir("../src/main/proto")

现在您可以通过插件块将约定插件应用到您的构建中。

plugins {
    id("myproject.protobuf")
}

相关问题