Gradle的目的是什么?

时间:2013-12-26 16:32:50

标签: android gradle android-studio android-gradle

我可以在Android Studio 0.4.0的上下文中使用一些帮助来理解Gradle(插件v 0.7)背后的概念。我之前没有使用过Gradle,它只会让我产生问题。我没有看到它的目的/好处,因为我对此知之甚少。

我有一些具体问题

  1. 这些依赖是什么?我正在制作一个简单的应用程序 导航抽屉,针对API 11+,应该是原生的 支持的。我可以使用哪些依赖项?

  2. 什么是Gradle包装?对完成的申请有何变化(

  3. 为什么Gradle需要经常在线?我没有 在我工作时,在我的个人笔记本电脑上访问互联网。它已经得到了 到了我无法运行或测试我的应用程序,因为Gradle不能 解决一些没有互联网访问的资源。

  4. 为什么Gradle使用Groovy很重要?我搜索过了 在互联网周围,往往是人们喜欢的东西 Gradle但他们通常不解释为什么Groovy很重要或者 它为Android应用程序做了什么。

  5. 有时作为中级程序员很难,因为信​​息往往过于简单或过于复杂。除了我的具体问题,您可以提供的任何其他信息都很有用。我不打算讨论Gradle与其他可能做同样事情的工具的利弊,我只想更多地了解Gradle及其使用,以便做出明智的决定。

    由于

4 个答案:

答案 0 :(得分:22)

  

这些依赖是什么?

您可能决定使用很多很酷的库。现在很多这些库都支持与gradle的集成。所以不再导入项目并自己托管。一切都在mavencentral托管。您仍然需要支持库,即使您决定使用API​​ 11 +。

  

什么是Gradle包装?

如果您在团队中工作,或者特别是在开源项目上工作,那么gradle包装器是一个很棒的工具。您不需要安装gradle。 gradle包装器将在第一次运行时下载并缓存其所有依赖项。因此,团队中的所有开发人员都可以非常快速地构建项目。

  

为什么Gradle需要不断上线?

因为需要同步依赖项。如果您使用的是Android Studio,那么您很幸运。 最新版本支持“gradle offline模式”。

来自release notes

  

Studio现在支持Gradle Offline模式。如果找到,这很有用   你自己没有网络连接,你的依赖关系正在使用   用于获取最新可用版本的plus语法。在这种情况下,   Gradle将每天一次(默认情况下)连接到工件   存储库以查看是否有更新版本。如果那个网络   连接失败,构建失败。如果您没有网络   连接,这是有问题的。您现在可以打开编译器>   Gradle选项并启用离线模式,它将告诉Gradle   忽略更新至今的检查:

gradle offline mode

  

为什么Gradle使用Groovy很重要?

你在Groovy中编写gradle插件。还有build.gradle中的所有gradle任务。


警告:我不是gradle的专家。实际上也是一个相对较新的用户。

答案 1 :(得分:19)

您的一些问题是一般性的,因为它们说明为什么构建工具作为一般事项是好事。其他人专门去Gradle。我会尝试尽可能简洁地解决这两个类别,同时试图避免别人的挑剔术语。

Maven,Gradle,SBT,Leiningen等构建工具有助于自动完成我们原本必须手动执行或“手动自动化”的任务。我使用后者来描述我以前用Ant做的事情 - 编写自定义任务来编译,运行,生成Javadoc等等,这样任务就可以在未来实现自动化。通过遵循最初由Maven定义并随后由其他人采用的约定(例如将源代码放在 src / main / java 中),这成为可能。如果我遵循约定,构建工具可以编译,运行,生成Javadoc,测试,以及其他所有工作。

现在问题(按顺序):

  1. 构建工具的另一个关键功能是通过跨构建以一致的方式管理依赖关系来减少“jar地狱”。我只是指定哪个版本的Apache Commons或Google Guava或Spring或Jackson我想要(甚至是各种版本),构建工具将下载它们并将它们放在某处,以便它们可以在类路径和构建中(如果适用)(如战争文件)。我也可以定义范围 - 比如我希望这个依赖项在编译时可用,但另一个只在运行时使用。我是需要明确提供还是可用?这样的东西。
  2. 这是特定于Gradle的。如上所述here,Gradle包装器可帮助团队运行Gradle,而无需手动安装Gradle,同时保持一致性。每个人都使用相同的版本。设置完成后,您永远不必担心它,并且您想要使用的所有Gradle任务都可以通过包装器获得,因此您甚至不需要关心它就在那里。您可以选择直接安装Gradle并直接运行,但我很少看到这一点。
  3. 这是一般的。我之前提到过依赖管理。为了获取这些依赖项,构建工具需要在Maven Central或一堆第三方存储库中可用的位置联机。其他人采用的另一种Maven创新是存储库管理,因此编译的工件根据约定发布到存储库,因此其他项目可以使用它们。通常,你不关心这一点。你只需告诉工具你需要一个特定的依赖关系,它知道如何抓住它,因为每个人都遵循惯例。在您无法访问互联网(我非常熟悉)的情况下,您可以选择在线时获取所有依赖项,然后选择设置本地Maven存储库(如Nexus或Artifactory)以将这些工件发布到。然后你告诉你的构建工具以及Maven Central等等。
  4. Maven配置了XML,当时看起来很酷。但是有两个后果。一个是配置变得非常冗长。另一个是很难做自定义的事情。你必须在XML中以声明方式做所有事情,许多人认为这很痛苦。您可以使用XML配置插件,或者编写自己的插件并以Maven可以理解的方式将其包装起来,并且可以使用XML进行配置。在代码中进行自定义构建时,它更容易,更强大。 Gradle为此选择了Groovy,因为Groovy提供了很好的DSL,并且对于来自Maven的Java开发人员来说非常容易学习。 SBT选择了Scala,Leiningen选择了Clojure,因为这些构建工具以这些语言/平台为目标,因此,例如,Scala开发人员除了DSL之外不需要学习任何新的东西来使用SBT。但更广泛的一点是,依赖代码而不是XML有很多好处。
  5. 希望有所帮助。

答案 2 :(得分:5)

我理解每个人所说的为什么Gradle的在线部分是必要的,但是对于我们这些在工作中防火墙后面的人,或者当我们可能在线下工作时,它真的给我们带来了必须上线的负担至少一次能够在离线模式下编译。

我只是不明白为什么要求这个项目。如果我在Android Studio中开始一个全新的项目,我想测试一个概念怎么办?除非我至少在线一次,否则我不能这样做。如果我当时无法访问互联网并想要这样做怎么办?那么呢?

似乎是一种不必要的要求,它给开发人员带来了可以避免的不必要的问题。再一次,我理解它背后的原因,但是,为了使用离线而强制要求至少在线编译一次似乎有点荒谬。

我想使用Gradle,但是在这个时候,由于在线要求,我们甚至无法在工作中使用它。我将不得不与我们的安全部门合作,确定在我们的防火墙中打出哪些漏洞,以便通过这个漏洞以及正确设置我们的代理以允许它。

所以,在这个时候,我不能推荐Gradle在我的工作地点使用,这意味着我们也将继续使用Eclipse进行Android开发,而不是Android Studio。似乎是一个似乎没有必要的限制性要求。

答案 3 :(得分:2)

让我们假设,对以下几点的理解是可以作为合理的基础:

  1. 什么是类,接口,API,包,模块和库。

  2. 什么是模块依赖关系,什么意思是“依赖关系管理”。

  3. 现代应用程序的复杂性。即使您使用简单的“Hello,world”应用程序(它是桌面应用程序还是Web应用程序),它应该包含十几个(如果不是一百个)各种库。所有这些库都为您的应用程序提供了基础架构,但其中许多都与它的逻辑没有直接关系。

  4. 如果您的应用不是“Hello,world”,那么隐藏它的复杂性(通过适当的模块化)并自动化它的组装和测试(通过使用适当的构建工具)对于成功至关重要。

    < / LI>

    考虑到这种理解(并考虑到上面亲爱的同事列出的宝贵考虑因素),开始谈论gradle,ant,ivy和maven是有道理的。