Gradle依赖管理及其子依赖项(嵌套依赖项)

3
我有三个项目。
../server/modelProject/
../client/apiProject/
../client/appProject/
apiProject需要依赖于modelProjectappProject需要依赖于apiProjectApi需要models,应用程序需要api。我认为这是一件很正常的事情:)
我的modelProject没有什么特别之处。 apiProject的设置如下:

settings.gradle

include ':app', 'models'
project(':models').projectDir = new File('../../server/modelProject')

build.gradle

dependencies {
    compile project(':models')
}

Last my appProject:

settings.gradle

include ':app', ':api'
project(':api').projectDir = new File("../client/apiProject")

build.gradle

dependencies {
    compile project(':api')
}

我正在开发的appProject依赖于api,而api又依赖于model,这样我就可以在appProject中使用所有model类。但实际情况并非如此。我遇到了以下错误:
“项目路径:models在项目“:api”中找不到。”
为了解决这个问题,我可以将appProject的settings.gradle文件扩展到:
include ':app', ':api', ':models'
project(':api').projectDir = new File('../client/apiProject')
project(':models').projectDir = new File('../../server/modelProject')

但这不是一个好的解决方案,也不是我期望的。

所以我的问题是: 这是gradle的正常行为吗?还是我做错了什么?我能否进行任何更改,使appProject仅依赖于apiProject,自动包含modelProject

3个回答

1
你的第一个settings.gradle文件将不会被使用。来自Gradle文档的说明:
多项目构建必须在多项目层次结构的根项目中有一个settings.gradle文件。这是必需的,因为设置文件定义了哪些项目参与多项目构建。
因此,你的第二个方法,在一个settings.gradle文件中列出所有项目是正确的。

是的,它是正确的并且可以工作。但是,例如,来自谷歌的play-services有一个对guava库的依赖关系。这不是一样的吗?只是他们从远程仓库获取它,而我从本地获取它! - StefMa
我想主要的区别在于,当你依赖于Play服务时,你依赖于一个AAR库,传递依赖也是如此。如果你设置你的apiProject依赖于modelProject的已编译构件,那么它可能会工作,但是每当你想编译modelProject的新版本时,你都必须单独完成。 - wojtek.kalicinski

0

如果你要在模块之间创建依赖关系,你需要在根文件夹中放置一个顶级的settings.gradle,包含所有模块。


你的回答看起来和这个很相似 https://dev59.com/Xo_ea4cB1Zd3GeqPNFuU#32713512 所以请查看我的评论... - StefMa

0

只需要一个settings.gradle文件就足够了。您的项目文件树应该类似于:

项目

  • 客户端
    • api项目
      • build.gradle
    • 应用程序项目
      • build.gradle
  • 服务器
    • build.gradle
  • settings.gradle
  • build.gradle

settings.gradle ->

include ':app', ':api', ':models'

project(':app').projectDir = new File(rootProject.projectDir,'client/appProject')
project(':api').projectDir = new File(rootProject.projectDir,'client/apiProject')
project(':models').projectDir = new File(rootProject.projectDir,'server/modelProject')

而你的依赖流是你所解释的。


不,不完全是。我正在开发“appProject”。所以我使用了“appProject”中的“settings.gradle”。或者这样做是错误的吗?你的“Project”看起来像是所有项目的包装器... - StefMa
尝试不将设置绑定到特定模块。 - adnbsr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接