【问题标题】:How to reuse the submodule in Gradle?如何重用 Gradle 中的子模块?
【发布时间】:2015-11-01 20:37:18
【问题描述】:

我有两个以下 Android Studio 项目,结构如下:

projectA/
    ├----build.gradle
    ├----settings.gradle
    ├----bluewhale/
    ├----krill/

projectA settings.gradle 文件:include 'bluewhale', 'krill'

projectB/
    ├----build.gradle
    ├----settings.gradle
    ├----hello/
    ├----krill/

projectB settings.gradle 文件:include 'hello', 'krill'

您可以看到“projectA”和“projectB”包含相同的模块“krill”。实际上,这是一个图书馆项目。

我的问题是:如何在 Gradle 中重用子模块“krill”?我不想在每个项目中都包含相同的“磷虾”副本

期待您的回复!谢谢!

【问题讨论】:

    标签: android android-studio gradle android-gradle-plugin


    【解决方案1】:

    终于在这里找到了一篇文章:an-alternative-multiproject-setup-for-android-studio。它非常适合我!

    它向我们展示了另一种不同于谷歌Gradle Plugin user guide recommends的方式

    示例代码如下:(将此脚本添加到您的项目settings.gradle 文件中)

    include ':krill'
    project(':krill').projectDir = new File('../otherProject/krill')
    

    项目结构如下:

    RootFolder/
        ├----projectA/
        │   ├----build.gradle
        │   ├----settings.gradle
        │   └----bluewhale/
        │
        ├----projectB/
        │   ├----build.gradle
        │   ├----settings.gradle
        │   └----hello/
        │
        └----otherProject/
            ├----krill/
            │   └----build.gradle
            │
            └----otherModule/
                └----build.gradle
    

    更多详情请访问gradle官方文档:Multi Project Builds

    【讨论】:

      【解决方案2】:

      如果您有一个在多个项目中使用的子模块,您应该考虑将其提取到一个单独的项目中。然后,您可以从中创建一个依赖项,并将其包含在 dependencies 部分的两个项目中。

      如果您只使用本地机器进行开发,没有任何自定义存储库,最好的方法可能是使用mavenLocal() 存储库。您可以使用 maven publish plugin 将您的 jar 发布到本地 maven 存储库中。应该就像将它添加到新的 krill 一样简单:

      apply plugin: 'maven'
      apply plugin: 'maven-publish'
      
      publishing {
          publications {
              maven(MavenPublication) {
                  from components.java
                  artifact sourceJar {
                      classifier "sources"
                  }
              }
          }
      }
      
      repositories {
          mavenLocal()
      }
      

      您可能想要设置组和工件 ID。请参阅the documentation 了解更多信息。

      您也可以将 krill 保留在其中一个项目中,比如 ProjectA,如果它与它有某种关系的话。然后在 krill 子模块中设置 maven 发布。您也可以通过运行 gradle :krill:publishToMavenLocal 发布到本地 maven,然后将其用作 ProjectB 中的依赖项。

      另一种选择是将子模块保存在 projectA 和 projectB 树之外,并使用以下内容添加它:

      include("krill")
        project(":krill") {
          projectDir = new File("$settingsDir/../krill")
      }
      

      但我不能推荐这个,因为它很老套,而且你的 IDE 也可能有问题。

      最后可能的事情是从您的 krill 项目所在的目录创建到 ProjectA 和 ProjectB 的符号链接。但这是一个非常糟糕的主意,例如当您使用版本控制时。

      【讨论】:

      • 但是如果我的模块经常被修改怎么办,我需要经常将(jar/aar)发布到(本地/远程)maven仓库。有没有办法直接引用模块?
      • 我认为可以,请参阅更新。但它很老套。你为什么不喜欢经常出版?无论如何,你应该运行你的单元测试并且发布到本地 repo 几乎不需要时间。
      • 谢谢,我更喜欢用第二种方式!
      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 2020-06-02
      • 2014-09-30
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      相关资源
      最近更新 更多