【问题标题】:Gradle Module Build OrderGradle 模块构建顺序
【发布时间】:2017-07-08 20:12:56
【问题描述】:

我有一个 Gradle 根项目 P 和两个子项目 P:fooP:bar。自然,Gradle 按字母顺序构建它们:barfoo。但是当我在P 根目录中说gradle build 时,我需要先构建foo。这是因为bar 依赖于foo 发布到本地Maven 存储库的AAR(Android 库)工件。 barfoo 都是这样的 Android 库项目。

这看起来是个简单的问题,但我想不通。我读到了evaluationDependsOn,所以在bar/build.gradle,我在第一行说:evaluationDependsOn "foo:"。唉,这似乎没有任何效果。这个 Gradle 功能到底是不是坏掉了?

使用compile project,我可以强制先构建foo,但这会将编译后的类直接添加到bar,这是我不想要的。

所以我被困住了。我可以将 foo 重命名为 aaa_foo,我的所有问题都会消失,但我不敢称其为解决方案。

【问题讨论】:

  • "使用编译项目,我可以强制首先构建 foo,但这会将编译后的类直接添加到 bar,这是我不想要的" -- 仅当 bar 是一个应用程序时模块,在这种情况下,您应该希望在其中包含 foo 类。如果bar 是一个库模块,foo 类将不会进入bar AAR。
  • 如果我说compile project,Gradle 会尝试链接库两次(一次用于compile project,一次用于 Maven-repository 依赖项),我收到错误消息“错误:超过一个包名为“com.acme.frob”的库。
  • 那么你的 Gradle 构建脚本有问题。由于您的问题不包括它们,因此我无法确切告诉您哪里出错了。但几乎我的每个 CWAC 库都有两个模块:库和链接到库的演示项目。有时一个项目有两个库或两个演示。它们都使用compile project()(用于同一整体项目中的库到库依赖项)或debugCompile project()(用于演示到库的依赖项,我使用releaseCompile 来确认我可以从我的工件存储库中提取) )。
  • 我更新了问题文本以使其更加清晰。这两个项目都是库项目——它们都推送到本地 Maven 存储库。
  • 我的 CWAC-NetSecurity 库有两个库模块(netsecuritynetsecurity-netcipher)。项目参考工作正常。我在之前的评论中确实犯了一个错误,因为我使用debugCompile project() 而不是compile project() 来表达netsecurity-netcipher 如何依赖netsecurity

标签: android gradle build module


【解决方案1】:

好的,让我自己回答这个问题。我想我找到了一个不错的解决方案。

Gradle 中的项目依赖通常用compile project 的方式表示,它不仅会构建其他项目,还会将其他项目的类添加到当前项目的类路径中。如果您只想确保在您的项目之前构建了另一个项目,您可以使用 task 依赖项

在我的 Android 环境中,bar/build.gradle,我有

preBuild.dependsOn ":foo:build"

一切都很好。现在foo 总是在bar 之前构建。

【讨论】:

  • 我刚刚花了很多时间做这个:项目构建顺序。谢谢... 有很多关于如何在 Gradle 中重新排序任务的资料。
  • 谢谢,你救了我的命!
【解决方案2】:

这可能会帮助那些可能有不同原因的问题。

假设我有一个模块base 生成主模块app 所需的输出,所以我希望在app 之前构建base

您可以在项目根目录中检查您的settings.gradle 并检查配置。

我发现我之前的配置是

include ':app', ':base'

改成

include ':base', ':app'

解决了建筑顺序。

【讨论】:

  • 好吧,就像“哇”;有这方面的官方文档吗? current docs 什么也没说(当然我不指望现代文档会说相关的东西,这种做法很久以前就结束了)。
  • 罗伯特,我无法确认。我刚刚玩弄了我的settings.gradle,发现更改包含顺序可能会对构建顺序产生一些影响,但不清楚具体是哪种影响。为了实现定义明确的构建顺序,我需要按照我上面描述的方式注入任务依赖项,对普通 Java 模块使用 tasks."compileJava".dependsOn :other:assemble,对 Android 模块使用 tasks."preDebugBuild".dependsOn :other:assembleDebug
  • 订单似乎对问题没有任何影响。 preBuild.dependsOn 对我有用。
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 2013-07-27
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2013-06-03
  • 2013-09-08
  • 2012-06-23
相关资源
最近更新 更多