如何将 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 add
将 MyLibrary
添加到 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
下的模块属于根项目 MyProject
,MyLibrary
内的所有内部依赖项都需要加上前缀 :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')
}
}
而且有效!
我正在尝试将 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 add
将 MyLibrary
添加到 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
下的模块属于根项目 MyProject
,MyLibrary
内的所有内部依赖项都需要加上前缀 :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')
}
}
而且有效!