Gradle - 递归地包含外部项目及其子项目

Zac*_*ker 7 gradle

我有一个gradle项目,其中包含许多名为的子模块shared-library.

我有一个名为service依赖于其中一个模块的项目shared-library.例如,它取决于:shared-library:module1.通常,我从maven获得这种依赖.

现在我想shared-library使用依赖项目修改和测试我的更改.而不是改变shared-library,构建,部署到maven,然后重建我service,我想直接service依赖shared-librarygradle项目.

所以我发现你可以将gradle指向文件系统上的任意项目目录:

服务/ settings.gradle

include "shared-library"
project(":shared-library").projectDir = new File("/projects/shared-library")
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,该项目并不知道shared-library子模块.我不能做到这一点:

服务/的build.gradle

compile(
project(":shared-library:module1"),
)
Run Code Online (Sandbox Code Playgroud)

所以我include直接尝试了它们.:shared-library:module1取决于:shared-library:module2所以我也包括那个:

服务/ settings.gradle

include "shared-library"
project(":shared-library").projectDir = new File("/projects/shared-library")
include "shared-library:module2"
include "shared-library:module1"
Run Code Online (Sandbox Code Playgroud)

但是现在当我尝试运行它时,它抱怨:shared-library:module1无法找到一个名为的项目:module2.这是因为它的依赖关系配置如下:

共享库/模块1 /的build.gradle

compile(
project(":module2")
)
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其更改为绝对项目路径,现在shared-library无法自行编译:

共享库/模块1 /的build.gradle

compile(
project(":shared-library:module2")
)
Run Code Online (Sandbox Code Playgroud)

tl; dr,似乎service解析shared-library子模块名称的方式与shared-library它是如何不匹配的.

pot*_*tyl 3

你说得对。您可以导入外部项目,甚至外部子项目,并在主项目中引用它们,但是一旦编译外部实体,它们就无法使用预期的名称进行解析。

我发现您可以重命名主项目中的外部项目,以便它们与外部项目的名称匹配。这样您的主项目和外部项目就使用相同的名称。

将您的更改service/settings.gradle为:

include "shared-library"
project(":shared-library").projectDir = new File("/projects/shared-library")

include "shared-library:module2"
project('shared-library:module2').name = ':module2'

include "shared-library:module1"
project('shared-library:module1').name = ':module1'
Run Code Online (Sandbox Code Playgroud)

现在,在您的项目和外部项目中,始终将您的模块称为:module1:module2。正在service/build.gradle使用:

compile(project(":module1"))
Run Code Online (Sandbox Code Playgroud)