首页 > 解决方案 > 如何在 gradle 项目中配置依赖项,使其也可以作为子模块工作?

问题描述

我想在我的项目中使用一个项目作为 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时,子模块的绝对路径突然改变了。我可以以某种方式将':子模块:秒作为:秒'吗?

我知道我可以相应地使用implementation project(somePrefix + ":second")和定义它somePrefix,但这将涉及触摸子模块。

标签: gradlegit-submodules

解决方案


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

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

从文档中查看以下示例:

// 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并设置复合构建。复合构建与经典的多项目构建的耦合不同。由于您的 Git 子模块指示可以用作独立项目(带有自己的settings.gradle)的构建,多项目构建的强耦合似乎不合适。多个settings.gradle文件也可能在多项目构建中导致问题,但对于复合构建来说很好。


推荐阅读