144

我有一个示例项目,具有以下设置:

/root
  + Pure Java Lib
  + Android Test Lib
  + Android Test Project

测试项目”依赖于“测试库”,最后一个依赖于“纯 Java 库编译项目并启动此设置工作正常。

我现在正在考虑导入我以前的 Eclipse 工作区并使用 Android Studio,问题是项目设置不同,我想保持这种方式。

例如,如果使用前面的示例:

/root
  + Android Test Lib
  + Android Test Project

/Some Other folder (another repository for example)
  + Pure Java Lib

我已经尝试了很多配置,但我没有找到一种方法来引用父文件夹范围之外的项目(在示例案例中为“ root ”)。

在许多平台/模块中,您可以使用“..”在文件夹中向上移动,但这对我不起作用,也许我用错了。

有谁知道如何使用 Gradle 实现这一点?

更新

我会尝试更通用:

/C:/

  /Project A
    + Module 1 - Pure Java
    + Module 2 - Android Test Lib
    + Module 3 - Android Test Project

  /Project B
    + Module 1 - Pure Java
    + Module 2 - Pure Java
    + Module 3 - Pure Java

我想在项目 A中使用项目 B的模块 1 。


更新:09-03-19

我现在看到了,我必须更新......经过将近 6 年,今天我更聪明了,我可以肯定地说问题是我误解了“真相之源”的概念。

虽然有一个库的引用是一个很好的概念......并且可能看起来像一个“真相来源”,但真正的“真相来源”将是每个项目使用该库的代码版本,因为该库本身有版本..许多版本,“事实来源”与使用该库的项目相关。

正确的方法是使用大多数开发人员不喜欢的东西,那就是 git 子模块,是的,在每个项目中复制源代码导致每个项目最有可能使用不同版本的代码。

但是,您需要针对所有项目使用所有库的最新和最好的版本。这本身就是一个挑战

这是使用库源开发项目的正确方法的原因是它可以扩展......您可以拥有数百个项目,每个项目都有自己的库配置。

4

6 回答 6

224

假设 Some Other Folder 是一个 gradle 项目,您可以在 settings.gradle 文件中添加如下内容:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')
于 2013-07-05T13:37:21.210 回答
55

你必须把你的文件settings.gradle这行:

include ':module2'
project(':module2').projectDir = new File(settingsDir, '../Project 2/Module2')

然后你必须在依赖树中添加你的builde.gradle (Module: app) ,这一行:

implementation project(':module2')

或进入Project Structure > app > Dependencies,单击Add,选择3 Module Dependencies并选择您的模块

于 2015-04-13T10:42:10.600 回答
9

使用 Gradle 1.10(不知道这将适用于哪些其他版本)这是我根据此处给出的响应提出的http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

我有一个 api 库项目、一个公共库项目和一个主应用程序项目。每个都是一个独立的开发项目,这两个库旨在在多个应用程序之间共享。

在通用项目的 settings.gradle 中:

def apiLibDir = file('../android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

然后在主app项目settings.gradle中:

def apiLibDir = file('../android-libs/android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

def commonLibDir = file('../android-libs/android-common/android-common-lib')
settings.createProjectDescriptor(rootProjectDescriptor, 'android-common-lib', commonLibDir)
include ':android-common-lib'

在每个相应的 build.gradle 文件中,您只需按您在 settings.createProjectDescriptor 中给它们的名称引用它们,就像您对任何其他项目依赖项一样:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':android-api-lib')
    compile project(':android-common-lib')
}

这似乎有效。它甚至没有为定义 api 库的多个 DEX 文件引发错误,我怀疑是因为它都是同一个构建过程的一部分,而 Gradle 足够聪明,可以解决所有问题。

于 2014-06-17T05:00:29.297 回答
8

右键单击项目-选择“打开模块设置”-在左侧窗格中选择“模块”-单击顶部的“+”符号-选择“导入模块”。

导入模块后。您需要将其添加为当前项目的依赖项。

在左窗格中保持“模块”处于选中状态并单击您的项目 - 现在进入依赖项选项卡并单击位于底部的“+”符号 - 选择第三个选项“模块依赖项”,如果您已正确导入项目,它将向您展示可以作为依赖项添加到当前项目的所有可用模块。

于 2013-07-04T23:48:47.747 回答
1

我重新提出这个问题的方式涉及原始发帖人的意图:我们如何引用位于我们主要 Android 项目目录之外的自定义 Android 和 Java 库?

在那里我回答我自己的问题。我的答案核心使用@Ethan(当前线程中所选答案的作者)gradle coding洞察力。但我的回答也解决了其他一些问题,并提供了详细的分步示例。

于 2018-03-17T00:17:08.437 回答
-1

正如 Ethan 所说,如果您将其添加到您的 settings.gradle 中,它将向 Android Studio 添加一个外部项目(在本示例中,它位于父文件夹中):

project(':../ProjectB/:module1')

然后,要将其添加为您的一个项目的依赖项,只需将其作为另一个依赖项添加到该项目的 build.gradle 中(您也可以像这里一样以图形方式进行操作):

compile project(':../ProjectB/:module1')
于 2015-02-10T08:29:24.270 回答