将多模块 Gradle 库打包成单个模块

Pack a multi-module Gradle library into a single module

我将用 Kotlin 编写的基于 pancakes Gradle 的库拆分为多个模块:pancakes-corepancakes-addon1、...、pancakes-addonN. addon 个包括 core 个。

现在,大多数用户不应该关心,只需要包含所有依赖项的默认配置。但他们将不得不编写样板文件:

dependencies {
    implementation("pancakes:pancakes-core")
    implementation("pancakes:pancakes-addon1")
    ...
    implementation("pancakes:pancakes-addonN")
}

这对我来说是不行的。我可能不得不合并所有模块,尽管我刚刚花了一些时间将一些可替换的功能分支到它们自己的模块中。

除非!有一种方法可以这样写:

project(":pancakes-simple") {
    dependencies {
        autoForwardedApi(":pancakes-core")
        autoForwardedApi(":pancakes-addon1")
        ...
        autoForwardedApi(":pancakes-addonN")
    }
}

很遗憾,api 还不够。

是的,这是可能的,并且接近您想象的样子。

添加一个单独的子项目,例如 :pancakes-simple 并像您对普通模块所做的那样配置其发布。

然后只需添加您希望它公开的依赖项。如果你没有使用java-library插件,使用compile配置:

project(":pancakes-simple") {
    dependencies {
        compile(":pancakes-core")
        compile(":pancakes-addon1")
        ...
        compile(":pancakes-addonN")
    }
}

implementation 依赖项不同,如果它们添加对 pancakes-simple 模块的依赖项,这些将在消费者的编译类路径中可用。

使用 java-library 插件,api 依赖项也应该可以工作

java-library Gradle 插件是 api 从当前模块转发依赖项所必需的。这就是将所有模块打包成一个模块的方法:

  1. 在库的所有模块中添加 java-library 插件(并删除 java
  2. 像我的 :pancakes-simple 创建一个 api 依赖于所有其他模块的模块