Android 为什么build.gradle不';你看起来不太好吗?
我读到gradle是用groovy编写的。Android 为什么build.gradle不';你看起来不太好吗?,android,android-studio,gradle,groovy,Android,Android Studio,Gradle,Groovy,我读到gradle是用groovy编写的。 但是,我的build.gradle文件看起来不像groovy。 事实上,它看起来根本不像一种语言。 这是我的build.gradle文件: apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.isra
但是,我的build.gradle文件看起来不像groovy。
事实上,它看起来根本不像一种语言。 这是我的build.gradle文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.israelkariti.location2_1"
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
compile 'com.google.android.gms:play-services-maps:10.2.1'
testCompile 'junit:junit:4.12'
}
谁能给我解释一下这个语法是怎么回事。这种语法是如何成为Groovy代码的?
如果我遗漏了一些重要的东西,请详细说明它是如何工作的。
谢谢好吧,Gradle为其DSL增加了一些魔力,但从技术上讲,每个Gradle脚本都是完全有效的Groovy 要理解像
依赖关系
、应用插件:
等所有内容,我们需要了解不同类型的Gradle脚本:
- 生成脚本(
)Build.gradle
- 设置脚本(
)Settings.gradle
- 初始化脚本(例如
)init.gradle
apply插件:“com.android.application”
该接口扩展了接口,该接口定义了采用映射的apply
方法。在Groovy中,映射表示法是[key:value,…]
,可以省略括号,并且String
类型的映射键不写在引号中。因此,plugin:'com.android.application'
只不过是一个Groovy映射,它交给了apply
方法
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
...
}
我将继续这一部分,并以android
部分结束,因为这样更容易理解:
dependencies
不是Gradle关键字,它只是前面提到的接口的方法的名称。此方法采用一个闭包
,它被包装在大括号内。正常的方法调用括号再次被省略。闭包是在对象上执行的。现在我们只需将依赖项添加到配置中。我们可以使用add
方法并传递配置名称和依赖关系表示法(以及可选的新闭包)
格拉德尔魔法开始了。对于项目中的每个现有配置,将在DependencyHandler
中添加一个新方法,该方法的名称为相应的配置,因此我们可以简单地使用此方法,而不是一直使用add
。在为Java开发时,这些配置和方法包括compile
、runtime
、testCompile
(以及其他)。fileTree
再一次仅仅是接口的一种方法
android {
compileSdkVersion 25
...
}
接口定义的方法不是唯一可用的方法。Gradle插件(如您正在使用的Android插件)可以添加扩展或约定。这样,属性和方法可以像属于对象一样被调用。这就是如何通过构建脚本中的闭包来配置android
部分
在android
闭包中,发生了一些额外的Gradle魔法。您可能知道,在Groovy中,可以省略get
或set
部分,直接访问属性(同时仍然调用可能的getter或setter)。Gradle还为每个属性添加了一个名为属性的方法,该方法可用作setter。这样,我们可以调用compileSdkVersion
方法来设置compileSdkVersion
属性。再次省略括号。这只是一些语法上的甜点,让我们省略赋值运算符
无论何时启动新的大括号级别,基本上都使用闭包来配置对象。有时创建新对象,有时使用现有特性。有时,您需要阅读文档以准确了解发生了什么。Gradle不是用groovy编写的。Gradle构建脚本是一个groovy DSL。但是你在努力解决哪一个问题呢?对于依赖项:和Java项目:如果你包括插件和测试,那就足够公平了。主要的核心是Java,不过非常感谢。当你说“这只是一些语法上的甜点,让我们省略赋值运算符”时,你的意思是省略括号吗?用compileSdkVersion 25Groovy替换compileSdkVersion(25)可以省略所有“不必要的”括号,这是一种语言特性。因此,是的,您可以感谢Groovy编写了compileSdkVersion 25
,而不是compileSdkVersion(25)
。但通常,compileSdkVersion
不是一个方法,而是一个属性,因此您可以通过compileSdkVersion=25
为其赋值。现在Gradle为您生成了上面提到的方法,它是一个框架特性,您可以省略=
符号。