Gradle依赖项:通过相对路径编译项目

47

在Gradle(在Android Studio中)中,是否可以指定对当前项目范围之外的另一个Gradle项目的依赖项?例如,可以使用相对路径来指定依赖关系,类似于以下内容:

dependencies {
  compile project('../../stdlib/dagger')
}
所以我尝试的是这样的:
我有一个Android应用程序,结构看起来像这样:
- MyApp(路径为/Users/foo/workspace/MyApp) - app(路径为/Users/foo/workspace/MyApp/app)
并且我有一个gradle Android库项目,其中包含3个子模块:
- stdlib(路径为/Users/foo/workspace/stdlib) - dagger(路径为/Users/foo/workspace/stdlib/dagger) - utils(路径为/Users/foo/workspace/stdlib/utils) - http(路径为/Users/foo/workspace/stdlib/http)
我想将dagger、utils和http模块编译到MyApp项目中。由于stdlib库模块正在积极开发,随着MyApp的增长而增长。因此,我不想每次进行小更改时都将它们推送到maven存储库中。
所以,有没有可能以某种方式链接其他gradle项目?我正在寻找一种暂时的解决方案。一旦源代码稳定,我将把stdlib库推送到maven存储库中。
同时,使用sourceSet的解决方法也可以作为一种解决方法。我还考虑在MyApp中创建一个libraries文件夹,它是指向stdlib的符号链接,但我没能按预期使其工作。
 dependencies {
      compile project(':libraries:dagger')
    }
有什么办法可以解决Gradle中这样的依赖关系吗?
1个回答

104

您可以使用主项目中的 'settings.gradle' 文件来包含一个外部根项目模块。它也必须是gradle项目,并且在特定的Android构建情况下,您必须将每个模块配置为 "android-library" 插件项目。

例如,在'MyApp' 项目的 settings.gradle 文件中,您可以尝试这样做:

include 'app'
include 'dagger'
project(':dagger').projectDir = new File('/Users/foo/workspace/stdlib/dagger')

你的 'MyApp' build.gradle 必须以相对路径 Gradle 的方式反映出 'dagger' 模块的需求:

dependencies {
  compile project(':dagger')
}

就是这样。对于每个需要的外部模块,重复执行此步骤,您将拥有适当的Gradle多项目配置。


当我尝试这个时,我得到了一个 `在评估项目':account'时发生问题。
无法获取extra properties扩展中的'compileSdkVersion'属性,因为它不存在` account是我的外部项目
- T_C
7
它运行得很完美,但我想知道为什么include 'dagger'没有冒号,而project(':dagger').projectDir有冒号? - howerknea
@howerknea,这是因为在build.gradle中您使用了特定的Gradle Project API,该API具有与“Settings”对象的构造函数不同的语法方法调用。 “Settings”对象用于查找和执行每个Project API配置:它可以是一个或多个。 因此,不要太在意,这只是Gradle设置对象和Gradle项目API接口之间的语法区别。 - Martin Revert
虽然这是一个过时的线程,但是参考了Martin给出的答案中的一部分:“它必须是一个Gradle项目,并且在特定的Android构建情况下,您必须将每个模块配置为“android-library”插件项目。”这是什么意思?我需要在被引用的项目的build.gradle文件中添加“com.android-library”吗? - pingOfDoom
嗨@pingOfDoom!是的,在模块的build.gradle文件中,您需要指定“com.android.library”。请注意使用点而不是破折号,因为最近我尝试使用破折号编译时遇到了问题。 - Martin Revert

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