如何在 gradle 项目中配置依赖项,使其也可以作为子模块使用?

How do I configure a dependency in a gradle project such that it also works as a submodule?

我想在我的项目中使用一个项目作为 git 子模块,理想情况下不更改上游项目(或者如果有意义,以将合并到那里的方式更改它)。

问题是该项目由模块组成,其中2个我想直接使用,一个还依赖另一个。

myProject
├ submodule
| ├ first
| | ├ build.gradle: implementation project(":second") <---- this fails if I don't change it to :submodule:second
| ├ second
| ├ settings.gradle: include ':first', ':second'
├ app
| ├ build.gradle: implementation project(":submodule:first"), implementation project(":submodule:second")
| ├ settings.gradle: include ':submodule:first', ':submodule:second', ':app'

当我的项目 settings.gradle 替换子模块的 settings.gradle 时,子模块的绝对路径突然改变。我能以某种方式`include ':submodule:second as :second'吗?

我知道我可以使用 implementation project(somePrefix + ":second") 并相应地定义这个 somePrefix 但这会涉及到子模块。

Gradle 项目路径(例如 ':submodule:second'

  • 实际上代表项目层次结构。这意味着在 settings.gradle 中使用 include ':submodule:second' 将隐式创建一个名为 submodule 的项目,即使与构建完全无关。
  • 不需要匹配目录结构(这只是一个约定)。您可以将项目目录设置为独立于项目路径(和项目名称)。

查看 the documentation 中的以下示例:

// include two projects, 'foo' and 'foo:bar'
// directories are inferred by replacing ':' with '/'
include 'foo:bar'

// include one project whose project dir does not match the logical project path
include 'baz'
project(':baz').projectDir = file('foo/baz')

但是,我建议根本不要使用 include。而是使用 includeBuild 并设置 composite build。复合构建与经典 multi-project 构建的不同之处在于它们的耦合。由于您的 Git 子模块指示构建可以用作独立项目(具有自己的 settings.gradle),因此 multi-project 构建的强耦合似乎不合适。多个 settings.gradle 文件也可能会导致 multi-project 构建出现问题,但对于复合构建没有问题。