【问题标题】:How to add a library/module to a project using a gradle task?如何使用 gradle 任务将库/模块添加到项目中?
【发布时间】:2023-01-09 18:17:32
【问题描述】:

这个想法是能够在不实际修改代码的情况下将库添加到项目中。这主要是为了能够根据要求生成构建。虽然我可以使用 buildFlavors 实现这一点,但我希望能够灵活地为任意数量的库执行此操作。

基本上是这样的,

  • 我有一个基本应用程序
  • 一个团队开发了一个库 A
  • 我有另一个图书馆B
  • 一个客户只需要库 A,另一个需要 A 和 B。其他客户可能需要不同的库。

我需要的是将这些库添加到基础应用程序并根据要求生成构建。

为此,我创建了以下任务。目前我只是尝试使用已经在settings.gradle 文件中注册但未添加到项目中的本地模块

val myArg: String by project
//use task in this way - gradlew addDependencyAndGenerateBuilds -PmyArg dependency name
tasks.register("addDependencyAndGenerateBuilds"){
  doLast {
    if(project.hasProperty("myArg")){
      dependencies.implementation(dependencies.project(":$myArg"))
    }
    finalizedBy("clean", "build")
  }
}

现在,如果我运行此任务 - ./gradlew addDependencyAndGenerateBuilds -PmyArg libraryA,我会收到以下错误消息,

Task 'libraryA' not found in root project

我需要的是将此 libraryA 添加到基本应用程序并相应地生成新版本。

【问题讨论】:

  • “一个客户只需要图书馆 A,另一个需要 A 和 B。其他客户可能需要不同的图书馆。” -- 你说的“客户”是指“客户”之类的东西吗?如果是这样,那么我会使用产品口味,每位顾客使用一种口味。
  • @CommonsWare 是的,“客户”就是我的意思。但我不想为每个新客户创造一种新口味。我希望能够即时执行此操作,而无需对代码进行任何更改。澄清一下,这些库将以这样一种方式开发,即应用程序代码不需要任何更改即可访问库功能。这就是为什么我尝试编写一个 gradle 任务来动态添加库并生成包含这些库的构建。

标签: android build.gradle gradle-kotlin-dsl


【解决方案1】:

原来运行任务命令有问题。 myArglibraryA 之间需要有一个=

完整的命令是这样的,

./gradlew addDependencyAndGenerateBuilds -PmyArg=libraryA

虽然这解决了提到的问题(即未找到任务库 A..),但它未能构建并出现一些错误。

然后我放弃了整个想法,只是在应用程序 gradle 中添加了一个扩展方法。

fun DependencyHandlerScope.addExtension(extensionsFilePath: String) {
  val extensionsFile = File("${project.rootDir}", extensionsFilePath)
  if (extensionsFile.exists()) {
    val extensions = extensionsFile.readBytes().decodeToString()
    val extensionsJson = Gson().fromJson(extensions, JsonObject::class.java)
    if (extensionsJson.has("modules")) {
      println("Adding module dependencies")
      extensionsJson.getAsJsonArray("modules").forEach {
        implementation(project(it.asString))
      }
    }
  }
}

这在依赖块中使用,如下所示,

dependencies {
  ........
  ........
  addExtension("extensions.json")
}

此方法接收一个包含依赖项列表的 Json 文件,然后将它们添加到项目中。所要做的就是在生成构建之前编辑这个 json 文件。

为了进一步简化这一点,我刚刚添加了一个编辑 json 文件的任务,

val myArg: String by project
tasks.register("addNewExtension") {
  doLast {
    val extensionsFile = File(
      "${project.rootDir}",
      "extensions.json"
    )
    val extensionsJson = if (extensionsFile.exists()) {
      val extensionsData = extensionsFile.readBytes().decodeToString()
      Gson().fromJson(extensionsData, JsonObject::class.java)
    } else {
      JsonObject()
    }

    if (project.hasProperty("myArg")) {
      val modules = extensionsJson.getAsJsonArray("modules") ?: JsonArray()
      if (!modules.contains(JsonPrimitive(":$myArg"))) {
        modules.add(":$myArg")
      }
      extensionsJson.add("modules", modules)
    }

    extensionsFile.delete()
    extensionsFile.createNewFile()
    extensionsFile.writeBytes(extensionsJson.toString().toByteArray())
  }
}

然后你可以运行 - ./gradlew addNewExtension -PmyArg=libraryA,然后是 ./gradlew build。 这将更新 json,然后生成包含库的新构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多