Gradle 的目的是啥?
Posted
技术标签:
【中文标题】Gradle 的目的是啥?【英文标题】:What is the purpose of Gradle?Gradle 的目的是什么? 【发布时间】:2014-01-14 07:05:36 【问题描述】:我可以在 android Studio 0.4.0 的上下文中帮助理解 Gradle(plugin v 0.7) 背后的概念。我以前没有使用过 Gradle,它给我带来的只是问题。我没有看到它的目的/好处,因为我对此了解不够。
我有一些具体问题
这些依赖项是什么?我正在制作一个简单的应用程序 导航抽屉,针对 API 11+,它应该是本机的 支持的。我可以使用哪些依赖项?
什么是 Gradle 包装器?对完成的申请有什么改变(如果有的话)?
为什么 Gradle 需要经常在线?我没有 工作时在我的个人笔记本电脑上上网。得到了 以至于我无法运行或测试我的应用程序,因为 Gradle 不能 解决一些无法访问互联网的资源。
为什么 Gradle 使用 Groovy 很重要?我已经搜索过 在互联网上,这往往是人们喜欢的东西 Gradle,但他们通常不会解释为什么 Groovy 很重要或 它对 Android 应用有什么作用。
有时作为中级程序员很难,因为信息往往过于简单或过于复杂。除了我的具体问题之外,您可以提供的任何其他信息都会很有用。我不想讨论 Gradle 与其他可能做同样事情的工具的优缺点,我只是想更多地了解 Gradle 及其用途,以便做出明智的决定。
谢谢
【问题讨论】:
去官网看看gradle.org/overview 您是否熟悉构建工具(如 Maven 和 Gradle)一般如何提供价值? Maven是如何工作的?只是对您的参考框架感到好奇。 不,我以前没有使用过 Maven。我有使用 ANT 插件的 Eclipse/ADT 的学术经验。我以为 ANT 只是用于错误检查(也许我错了?)我读过 Gradle 是基于 Maven 和 ANT 但没有比这更多的理解。 另外,请查看新构建系统的 android 文档,tools.android.com/tech-docs/new-build-system 【参考方案1】:您的一些问题很笼统,因为它们说明了为什么构建工具作为一般问题是一件好事。其他人专门使用 Gradle。我会尽量简洁地处理这两个类别,同时避免其他人挑剔的术语。
Maven、Gradle、SBT、Leiningen 等构建工具有助于自动执行我们原本必须手动执行或“手动自动执行”的任务。我使用后者来描述我过去使用 Ant 所做的事情——编写自定义任务来编译、运行、生成 Javadoc 等,以便将来可以自动化这些任务。通过遵守最初由 Maven 定义并随后被其他人采用的约定(例如将您的源代码放在 src/main/java 中),这成为可能。如果我遵循约定,构建工具可以编译、运行、生成 Javadoc、测试和其他所有工作,而只需最少的额外工作。
现在回答您的问题(按顺序):
-
构建工具的另一个关键功能是通过以一致的方式管理构建之间的依赖关系来减少“jar 地狱”。我只是指定我想要的 Apache Commons 或 Google Guava 或 Spring 或 Jackson 的版本(甚至是版本范围),构建工具将下载它们并将它们放在某个地方,以便它们可以在类路径中,如果适用的话,在构建中(比如战争文件)。我还可以定义范围——比如我希望这个依赖在编译时可用,而另一个依赖只在运行时可用。我需要明确提供它,还是可以使用它?诸如此类。
这是 Gradle 特有的。如here 所述,Gradle 包装器可帮助团队运行 Gradle,而无需手动安装 Gradle,同时还能保持一致性。每个人都使用相同的版本。一旦你设置好它,你就不必担心它,你想使用的所有 Gradle 任务都可以通过包装器获得,所以你甚至不需要关心它在那里。可以选择直接安装Gradle,直接运行,但是我很少看重点。
这是一般情况。我之前提到了依赖管理。为了获取这些依赖项,构建工具需要从 Maven Central 或一堆第三方存储库中获取它们。其他人采用的另一个 Maven 创新是存储库管理,因此编译的工件按照约定发布到存储库,以便其他项目可以使用它们。通常,你并不关心这个。你只需告诉工具你需要某种依赖,它就知道如何获取它,因为每个人都遵循约定。在您无法访问 Internet 的情况下(我对此非常熟悉),您的选择是在您在线时获取所有依赖项,然后可以选择设置一个本地 Maven 存储库,如 Nexus 或 Artifactory 以将这些工件发布到。然后你告诉你的构建工具去那里看看 Maven Central 等等。
Maven 是用 XML 配置的,这在当时看起来真的很酷。但是有两个后果。一是配置变得非常冗长。另一个是很难做定制的事情。您必须以声明方式在 XML 中做所有事情,许多人觉得这很痛苦。您可以在 XML 中配置插件,或者您自己编写并以 Maven 可以理解并可以在 XML 中配置的方式包装它。在代码中进行自定义构建要容易得多,功能也更强大。 Gradle 为此选择了 Groovy,因为 Groovy 可以提供很好的 DSL,并且对于来自 Maven 的 Java 开发人员来说非常容易学习。 SBT 选择了 Scala,而 Leiningen 选择了 Clojure,因为这些构建工具针对这些语言/平台,因此,例如,Scala 开发人员无需学习任何新知识即可使用 SBT,而无需学习 DSL。但更广泛的一点是,依赖代码而不是 XML 有很多好处。
希望对您有所帮助。
【讨论】:
【参考方案2】:这些依赖项是什么?
您可能会决定使用许多很酷的库。现在很多这些库都支持与 gradle 的集成。因此,无需再导入项目并自行托管。一切都托管在 mavencentral 上。例如,即使您决定以 API 11+ 为目标,您仍然需要支持库。
什么是 Gradle 包装器?
如果您在团队中工作,或者特别是在开源项目中工作,那么 gradle 包装器是一个很棒的工具。您不需要安装 gradle。 gradle 包装器将在第一次运行时下载并缓存其所有依赖项。因此,您团队中的所有开发人员都可以非常快速地构建项目。
为什么 Gradle 需要经常在线?
因为依赖需要同步。如果您使用的是 Android Studio,那么您很幸运。 最新版本支持“gradle 离线模式”。
来自release notes:
Studio 现在支持 Gradle 离线模式。如果你发现这很有用 您自己没有网络连接,并且您的依赖项正在使用 用于获取最新可用版本的 plus-syntax。在这种情况下, Gradle 将每天一次(默认情况下)连接到工件 存储库以查看是否有更新的版本。如果那个网络 连接失败,构建失败。如果您没有网络 连接,这是有问题的。您现在可以打开编译器 > Gradle 选项并启用离线模式,这将告诉 Gradle 忽略最新的检查:
为什么 Gradle 使用 Groovy 很重要?
您在 Groovy 中编写 gradle 插件。以及 build.gradle 中的所有 gradle 任务。
注意:我不是 gradle 方面的专家。实际上也是一个相对较新的用户。
【讨论】:
在 Android Studio 中提到 Gradle 离线模式,做得很好。 感谢截图,帮了大忙【参考方案3】:我理解每个人所说的为什么 Gradle 的在线部分是必要的,但是对于我们这些工作时在防火墙后面的人来说,或者当我们可能离线工作时,不得不上网确实给我们带来了负担至少一次才能在离线模式下编译。
我只是不明白为什么对项目提出这个要求。如果我在 Android Studio 中开始一个全新的项目,我想用它来测试一个概念怎么办?除非我至少在线一次,否则我做不到。如果我当时无法访问互联网并想这样做怎么办?然后呢?
似乎是一个不必要的要求,会给开发人员带来不必要的问题,而这些问题是可以避免的。同样,我理解其背后的原因,但是,强制要求至少在线编译一次才能离线使用似乎有点荒谬。
我想使用 Gradle,但目前由于在线需求,我们甚至无法在工作中使用它。我将不得不与我们的安全部门合作,确定要在我们的防火墙上打哪些洞,以便允许它通过,并正确设置我们的代理以允许它。
因此,目前,我不推荐在我的工作地点使用 Gradle,这意味着我们还将继续使用 Eclipse 进行 Android 开发,而不是 Android Studio。似乎是一个似乎没有必要的限制性要求。
【讨论】:
我也有同样的问题。下载并启动 Android Studio。只是不能这样做,因为它试图下载一些 Gradle 依赖项,它只是挂在那里等待。我在代理后面:(。有没有办法禁用 Gradle 并继续前进。我愿意自己手动查找依赖项并编写构建脚本,而不是 IDE 无法启动。:(【参考方案4】:让我们假设,对以下几点的理解是令人愉快的基础:
什么是类、接口、API、包、模块和库。
什么是模块依赖,什么是“依赖管理”。
现代应用程序的复杂性。即使您做一个简单的“Hello, world”应用程序(它是桌面应用程序还是 Web 应用程序),它也应该包含十几个(如果不是一百个)各种库。所有这些库都为您的应用提供了基础设施,但其中许多与应用的逻辑没有直接关系。
如果您的应用程序不是“Hello, world”,那么隐藏它的复杂性(通过适当的模块化)并自动化它的组装和测试(通过使用适当的构建工具)对于成功至关重要。
考虑到这种理解(并考虑到上面亲爱的同事列出的宝贵考虑),开始谈论 gradle、ant、ivy 和 maven 是有意义的。
【讨论】:
以上是关于Gradle 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章