Gradle包含依赖项的依赖

3

场景

我有两个Android库:

  • 库A
  • 库B

库B依赖于库A,并从其build.gradle中包含它。

我的Android应用程序需要使用库B和库A的一些基础类。我唯一成功的做法是在我的Android应用程序的build.gradle中包括这两个库并将transitive设置为false。

问题

是否有一种方法只添加库B并从我的Android应用程序访问其依赖项?


Android Studio

Android Studio 3.1 Canary
Build #AI-171.4415322, built on October 24, 2017
JRE: 1.8.0_152-release-1012-b01 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.12.6

Gradle

3.1.0-alpha01

我认为应该在B库自身中启用该选项,但这被视为“不良实践”。因此,要么包含两个库,要么让B库提供该依赖项。 - Entreco
@Entreco 谢谢,你有解释为什么这被认为是不良实践的来源吗? - zafrani
你如何引入库?使用Maven还是本地方式?请发布你的build.gradle文件。 - Gabriele Mariotti
我在本地将A包含到B中。我使用Maven将A和B包含到我的Android应用程序中。 - zafrani
2个回答

3

如果您需要在您的应用程序中使用库A,并且您的库A是使用implementation project(': LibA')包含在B中的,则它不会成为主要的app的传递性。

您必须使用api将其包含在B中,例如api project(':LibA')

对于导出到外部模块的依赖项(传递依赖项),应使用api配置。相反,对于组件内部的(非传递依赖项)依赖项,应使用implementation配置。


2

这被称为传递依赖。

Gradle和其他依赖系统会自动处理这个问题。如果B需要A,你就会得到A。如果你没有得到A,那么意味着B的依赖关系不正确。

是否应该在依赖关系中明确调用A是一个有争议的话题。我认为不应该这样做的原因是,你最终可能会得到类似这样的东西:

include B(v1.0) -depends on-> A(1.0)
include A(1.1)

现在,你的应用程序编译并在运行时使用哪个版本的A?是A 1.0还是A 1.1?答案取决于构建系统的实现。
  • 如果是A 1.0,则正在针对1.1进行编译,但在运行时使用1.0。
  • 如果是1.1,则B是针对1.0进行编译,但在运行时使用1.1。

我正在使用 implementation project(':LibA') 将 A 包含到 B 中。我应该以不同的方式包含它吗? - zafrani
如果你运行的平台在运行时没有提供 A ,那么就有问题了。 implementation 意味着你对其进行编译,但它并未打包到你的应用程序中,而你期望平台(我想在这种情况下是安卓)将其提供。 - Jeffrey Blattman

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