0

如何将单个源集添加到多个子项目?

首先……是的,我知道这有多荒谬。这只是我必须做的事情。

设置

  • 该项目使用 Groovy DSL。
  • 有 3 个子项目(A、B、C),每个子项目都有自己独特的主源集。
  • 这些项目之外还有 5 个额外的源集(1、2、3、4、5)。
  • 可以单独编译外部源集的 Nonce。
  • 所有源集都依赖于在每个子项目中定义了 3 个不同时间的接口。
  • 子项目主源不能依赖任何外部源
  • 1和2需要用A、B、C编译。
  • 3需要用A和B编译。
  • 4需要用B和​​C编译
  • 5 只需要用 C 编译。
  • 4 和 5 需要依赖于 2 中定义的类。
  • 5 必须是一个独立的源集,以便它可以作为源集包含在任何未来可能添加的子项目中。
  • 不允许任何外部源包含来自任何其他源集的源
  • 不允许单独编译任何外部源。
  • 不允许将任何外部源包含为 jar 或项目依赖项;它们必须作为源集包含在内,并且必须为包含它们的每个子项目单独编译。

一个

sourceSets {
    main {
        java {
            srcDirs = ["src",
                       "$rootDir/source_sets/1/src",
                       "$rootDir/source_sets/2/src",
                       "$rootDir/source_sets/3/src"
            ]
        }
    }
}

sourceSets {
    main {
        java {
            srcDirs = ["src",
                       "$rootDir/source_sets/1/src",
                       "$rootDir/source_sets/2/src",
                       "$rootDir/source_sets/3/src",
                       "$rootDir/source_sets/4/src"
            ]
        }
    }
}

C

sourceSets {
    main {
        java {
            srcDirs = ["src",
                       "$rootDir/interfaces/source_sets/1/src",
                       "$rootDir/interfaces/source_sets/2/src",
                       "$rootDir/interfaces/source_sets/4/src",
                       "$rootDir/interfaces/source_sets/5/src"
            ]
        }
    }
}

设置.gradle

include(":interfaces/A")
project(":interfaces/A").name = "A"

include(":interfaces/A")
project(":interfaces/A").name = "A"

include(":interfaces/A")
project(":interfaces/A").name = "A"

问题是 4 和 5 无法找到 2 中的类,我的 IDE(IntelliJ)无法解析正确的类路径。

我真正需要的是外部源集的行为就像它们有 3 个单独的副本,而实际上没有 3 个单独的副本,并且我需要在不使用符号/软链接的情况下这样做。

该解决方案只需要使用 gradle,但它可以使用 JetBrains“idea”插件进行 gradle,只要它不涉及提交“.idea”文件夹下的任何文件,但它可以包含内联 xml 或资源文件夹中的文件在 .idea 文件夹之外。

所以是的......这太复杂了,只是......呃!但事实就是如此。

4

1 回答 1

0

确实。

我没有答案,但这太长了,无法发表评论。所以这里。

我认为这只是 IntelliJ 的问题,而不是使用 Gradle 编译时的问题,对吧?如果是这种情况,您应该尝试根据需要在 IntelliJ 中为您的项目建模,一旦您找到了一种方法,然后弄清楚如何使用自定义 Idea 插件为您完成它。

但是,我很确定 IntelliJ 中的多个模块不能共享相同的“内容根”。所以我只看到你不想要的选项 - 要么复制(同步)源与仅用于 IntelliJ 的新文件夹(不允许修改),创建符号链接(并不总是便携式)或重组您的外部源,以便它们可以独立编译(这可能不容易)

:-(

于 2019-10-08T17:19:50.540 回答