Gradle的目的是什么?

38

我需要一点帮助来理解Gradle(插件版本为0.7)在Android Studio 0.4.0中的概念。我以前没有使用过Gradle,现在它给我带来了很多问题。因为我不够了解它,所以我看不到它的目的和好处。

以下是我具体的问题:

  1. 这些dependencies是什么?我正在制作一个简单的应用程序,其中包含一个导航抽屉,针对API 11+,应该可以被本地支持。我可以使用哪些dependencies?

  2. 什么是Gradle wrapper?它是否会对完成的应用程序产生影响?

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

  4. 为什么Gradle使用Groovy很重要?我在互联网上搜索了一下,人们喜欢Gradle使用Groovy,但通常他们不会解释Groovy之所以重要或对Android应用程序有什么作用。

作为一个中级程序员,有时候信息会过于简单或过于复杂。除了我的具体问题外,您可以提供的任何其他信息都将是有用的。我不想辩论Gradle与其他可能执行相同任务的工具之间的利弊,我只想更多地了解Gradle及其用途,以便做出明智的决策。

谢谢


1
请查看官方网站http://www.gradle.org/overview。 - Ethan
你是否熟悉构建工具(如 Maven 和 Gradle)如何提供通用价值,以及 Maven 如何运作?只是好奇了解你的参考框架。 - Vidya
不,我以前没有使用过Maven。我在学术上有使用Eclipse/ADT的经验,它使用了一个ANT插件。我认为ANT只用于错误检查(也许我错了?)我读到Gradle是基于Maven和ANT的,但除此之外我并没有更多的了解。 - DataCat Robin
此外,建议查看Android文档中有关新构建系统的内容,http://tools.android.com/tech-docs/new-build-system。 - petey
4个回答

27

您的一些问题是关于通用构建工具的好处,另一些问题则涉及Gradle。我会尽可能简洁地回答这两类问题,同时避免其他人的术语纠缠。

像Maven、Gradle、SBT、Leiningen等构建工具可以帮助我们自动化任务,否则我们将不得不手动执行或“手动自动化”。我用后者来描述我以前使用Ant所做的事情——编写自定义任务来编译、运行、生成Javadoc等等,以便未来可以自动化这些任务。通过遵循最初由Maven定义并随后被其他人采用的约定(例如将源代码放在src/main/java中),这变得可能。如果我遵循这些约定,构建工具可以轻松地进行编译、运行、生成Javadoc、测试和其他所有操作。

现在回答您的问题(按顺序):

  1. 构建工具的另一个关键功能是通过在构建过程中以一致的方式管理依赖项来减少“jar hell”。我只需要指定我想要的Apache Commons、Google Guava、Spring或Jackson的版本(甚至是版本范围),构建工具就会下载它们并将它们放在某个位置,以便它们可以在类路径和构建中(例如war文件)使用。我还可以定义范围——例如,我希望这个依赖项在编译时可用,但另一个只在运行时可用。我需要明确提供它,还是它会自动提供?就是这样。
  2. 这是针对Gradle的。如此处所述,Gradle包装器帮助团队在不必手动安装Gradle的情况下运行Gradle,并保持一致性。每个人都使用相同的版本。一旦设置好,您就无需担心它,所有您想要使用的Gradle任务均可通过包装器使用,因此您甚至不需要关心它是否存在。您可以选择直接安装Gradle并直接运行它,但我很少看到这样做有什么意义。
  • 这是通用的。我之前提到了依赖管理。为了获取这些依赖项,构建工具需要上网,在Maven Central或一堆第三方仓库中获取它们。其他人采用的Maven创新是仓库管理,因此编译好的构件按照规定发布到仓库中,以便其他项目可以使用它们。通常,您不需要关心这个。您只需告诉工具您需要某个特定的依赖项,因为每个人都遵循约定,它就知道如何抓取它。在没有互联网访问权限的情况下(我非常熟悉这种情况),您的选择是在上网时获取所有依赖项,然后选择性地设置本地Maven仓库,例如Nexus或Artifactory,以将这些构件发布到其中。然后告诉您的构建工具在Maven Central等地方查找。
  • Maven是用XML配置的,当时看起来真的很酷。但有两个后果。一个是配置变得非常冗长。另一个是很难做自定义的东西。你必须在XML中声明式地做所有事情,这让许多人感到痛苦。您在XML中配置插件,或者编写自己的插件并以Maven能够理解并且可以在XML中配置的方式包装它。使用代码做自定义构建工作更容易、更强大。Gradle之所以选择Groovy,是因为Groovy适合编写DSL,而对于从Maven来的Java开发人员来说,学习起来非常容易。SBT选择了Scala,Leiningen选择了Clojure,因为这些构建工具针对这些语言/平台,因此例如Scala开发人员不必学习除DSL之外的任何新东西才能使用SBT。但更广泛的观点是,依靠代码而不是XML具有很多好处。

  • 24
    这些依赖是什么?
    有很多很酷的库可以使用。现在很多这些库都支持与gradle集成。因此不再需要导入项目并自行托管。一切都托管在mavencentral上。即使您决定针对API 11+,例如,仍然需要支持库。
    什么是Gradle包装器?
    如果您正在团队中工作或特别是在开源项目上工作,则Gradle包装器是一种非常棒的工具。您不需要安装gradle。 Gradle包装器将在第一次运行时下载和缓存所有依赖项。因此,您团队中的所有开发人员都可以快速构建项目。
    为什么Gradle需要一直在线?
    因为需要同步依赖项。但是,如果您使用Android Studio,则很幸运。最新版本支持“gradle离线模式”。
    来自发布说明
    现在,Studio支持Gradle离线模式。如果您发现自己没有网络连接,并且您的依赖项使用加号语法来获取最新可用版本,则此功能非常有用。在这种情况下,Gradle每天(默认情况下)会连接到工件库,以查看是否有更新版本。如果该网络连接失败,则构建将失败。如果您没有网络连接,这是有问题的。您现在可以打开编译器> Gradle选项并启用离线模式,这将告诉Gradle忽略更新检查:

    gradle offline mode

    为什么Gradle使用Groovy很重要?
    你需要用Groovy编写Gradle插件,以及在build.gradle中编写所有Gradle任务。

    注意:我不是gradle专家,事实上我也是一个相对较新的用户。


    1
    在Android Studio中提到Gradle离线模式,做得很好。 - Vidya
    3
    谢谢您提供的截图,它帮了大忙。 - DataCat Robin

    8
    我理解大家提到的Gradle在线部分为什么是必要的,但对于我们这些在工作防火墙后面或者离线工作时,我们必须至少上线一次才能在离线模式下编译,这真的给我们带来了负担。
    我不明白为什么项目会有这个要求。如果我在Android Studio中开始一个全新的项目并想测试一个概念,我就必须至少上线一次才能做到。如果我此时没有网络访问权限并且想要这样做,那该怎么办呢?
    这似乎是一个不必要的要求,给开发人员带来了不必要的问题,这些问题可以避免。再说一遍,我理解背后的原因,但是强制要求至少在线编译一次才能使用离线功能似乎有点荒谬。
    我想使用Gradle,但目前情况下,由于在线要求,我们甚至不能在工作中使用它。我将不得不与我们的安全部门合作,确定我们的防火墙需要打开哪些端口,并正确设置代理以允许它通过。
    所以,目前我无法推荐在我的工作场所使用Gradle,这意味着我们还将继续使用Eclipse进行Android开发,而不是Android Studio。这似乎是一个限制性的要求,看起来并不必要。

    2
    我有同样的问题。已经下载并启动了Android Studio。但是由于它尝试下载一些Gradle依赖项并且一直卡在那里等待,所以我无法继续进行。我在代理后面:(。是否有一种方法可以禁用Gradle并继续前进。我愿意自己手动查找依赖项并编写构建脚本,而不是让IDE无法启动。:( - Sampath

    3
    假设以下几点的理解作为基础:
    1. 什么是类、接口、API、包、模块和库。

    2. 什么是模块依赖以及“依赖管理”的含义。

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

    4. 如果你的应用程序不是“Hello, world”,那么通过适当的模块化来隐藏其复杂性,并通过使用适当的构建工具自动进行装配和测试,对于成功至关重要。

    在这种理解的基础上(并考虑到以上同事所列出的宝贵考虑因素),开始谈论gradle、ant、ivy和maven是有意义的。

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