如何将 gradle 多项目存储库作为 git 子模块包含在另一个 gradle 项目中

How to include gradle multi-project repository as git submodule in another gradle project

我正在尝试将 Gradle 多项目存储库导入另一个 Gradle 项目作为 git 子模块。

这是多项目回购的结构:

MyLibrary
- lib-api
  - api-config
  - api-repository
- lib-impl
  - impl-config
  - impl-repository

在 Gradle 项目 MyLibrary 中,有几个模块依赖于该项目中的其他模块。例如,lib-api:api-repository 具有以下依赖关系:

implementation project(':lib-api:api-config')

lib-impl 下的模块也包括它们各自的 api 作为依赖项)

到目前为止一切正常,我可以构建,运行 并测试 lib-impl.

下的项目

现在我尝试将项目导入到另一个项目中

我使用 git submodule addMyLibrary 添加到 MyProject。这是现在的结构:

MyProject
- MyLibrary
  - lib-api
    - api-config
    - api-repository
  - lib-impl
    - impl-config
    - impl-repository
- api
- impl

为了能够使用 MyLibrary 下的模块,我将 MyProject 中的 settings.gradle 文件编辑为如下所示:

rootProject.name = 'MyProject'
include 'api'
include 'impl'
include 'mylibrary'
include 'mylibrary:lib-api'
include 'mylibrary:lib-impl'
include 'mylibrary:lib-api:api-config'
include 'mylibrary:lib-api:api-repository'
include 'mylibrary:lib-impl:impl-config'
include 'mylibrary:lib-impl:impl-repository'

问题

现在 MyLibrary 下的模块属于根项目 MyProjectMyLibrary 内的所有内部依赖项都需要加上前缀 :mylibrary。但只有当 MyLibrary 当前是另一个项目的子模块时才会出现这种情况。

为了构建 MyProject,我需要更改 MyLibrary 中的依赖项:

implementation project(':lib-api:api-config')
implementation project(':lib-api:api-repository')

对此:

implementation project(':mylibrary:lib-api:api-config')
implementation project(':mylibrary:lib-api:api-repository')

但是,:mylibrary 不需要存在,MyLibrary 才能通过自身编译成功(即,如果 MyLibrary 是根项目)。但是 MyLibrary 需要此更改才能作为子模块工作。

这过去不是什么大问题,因为我总是可以提取子模块 MyLibrary 并编辑必要的 build.gradle 文件。但是,我现在已经开始尝试设置持续集成,每当我尝试构建 MyProject 时,我都会收到关于这些导入在 MyLibrary 中无效的错误,因为 CI 将始终直接从中获取代码git 回购。

我觉得如果以下陈述有效,它可以解决我的问题:

implementation project(':mylibrary:lib-api:api-config').ifNotPresent(':lib-api:api-config')

提前感谢您的帮助

经过精彩的启示,我意识到 java 代码被允许在 build.gradle 文件中,所以我很自然地这样做了:

dependencies {
    if (rootProject.getName().equals("MyLibrary")) {
        implementation project(':lib-api:api-config')
    } else {
        implementation project(':mylibrary:lib-api:api-config')
    }
}

而且有效!