Gradle的目的是什么?

在Android Studio 0.4.0的上下文中,我可以用一点帮助来理解Gradle(插件v 0.7)背后的概念。 我之前没有使用过Gradle,它只是给我带来了问题。 我没有看到它的目的/好处,因为我对此不够了解。

我有一些具体的问题

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

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

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

  4. 为什么Gradle使用Groovy很重要? 我search了互联网,这往往是人们喜欢关于Gradle,但他们通常不解释为什么Groovy是重要的,或者它为Android应用程序做什么。

有时作为一名中级程序员很难,因为信​​息往往过于简单或过于复杂。 除了我的具体问题,你可以提供任何额外的信息将是有用的。 我不打算辩论Gradle vs其他可能做同样事情的工具的优点和缺点,我只想更多地了解Gradle及其用法,以便我可以做出明智的决定。

谢谢

Solutions Collecting From Web of "Gradle的目的是什么?"

你的一些问题是一般性的,因为他们谈论为什么构build工具是一件普遍的事情是件好事。 其他人专门到Gradle。 我将尽可能简洁地解决这两个类别,同时尽量避免其他人挑剔的术语。

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

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

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

希望有所帮助。

什么是这些依赖?

有这么多酷图书馆,你可能会决定使用。 很多这些库现在都支持与gradle的集成。 因此,不要再导入项目并自行托pipe。 一切都在mavencentral主办。 例如,即使您决定定位API 11+,仍然需要支持库。

什么是Gradle包装器?

如果你在一个团队中工作,或者特别是在一个开源项目中,gradle wrapper是一个非常棒的工具。 你不需要安装Gradle。 gradle包装器将在第一次运行时下载并caching所有依赖关系。 所以你们团队中的所有开发人员都可以很快build立这个项目。

为什么Gradle需要不断上网?

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

从发行说明 :

Studio现在支持Gradle离线模式。 如果您发现自己没有networking连接,并且您的依赖关系正在使用plus语法来获取最新的可用版本,那么这非常有用。 在这种情况下,Gradle会每天一次(默认情况下)连接到工件库以查看是否有更新的版本。 如果该networking连接失败,则构build失败。 如果你没有networking连接,这是有问题的。 您现在可以打开编译器> Gradle选项并启用离线模式,这将告诉Gradle忽略更新date检查:

gradle离线模式

为什么Gradle使用Groovy很重要?

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


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

我知道每个人都说为什么Gradle的在线部分是必要的,但是对于我们这些在工作中的防火墙后面,或者当我们可能离线工作的时候,真的给我们加负担至less要一次上网能够在离线模式下编译。

我只是不明白为什么这个要求放在项目上。 如果我要在Android Studio中开始一个全新的项目,那么我想要testing一个概念呢? 除非我在线至less一次,否则我无法做到这一点。 如果当时我无法上网,想要这样做呢? 然后怎样呢?

看起来像是一个不必要的要求,给开发者带来了不必要的问题,可以避免。 再次,我明白其背后的原因,但是,至less强制一次在线编译的要求,以便脱机使用似乎有点荒谬。

我想使用Gradle,但是在这个时候,由于在线需求,我们甚至无法在工作中使用它。 我将不得不与我们的安全部门合作,以确定在我们的防火墙上打出什么漏洞,以便通过这个漏洞,并正确设置我们的代理服务器。

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

我们假设,对以下几点的理解是可以接受的基础:

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

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

  3. 现代应用的复杂性。 即使你做了一个简单的“你好,世界”的应用程序(它会是一个桌面应用程序或networking应用程序),它应该包括一打(如果不是一百)各种图书馆。 所有这些库为您的应用程序提供基础架构,但是其中很多与您的应用程序的逻辑没有直接关系。

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

有了这个理解(并考虑到宝贵的考虑,上面亲爱的同事列出)开始说话的gradle,ant,常春藤和maven是有道理的。