Gradle
是一?基于
Apache Ant
和
Apache Maven
?念的?目
自?化建?
工具。Gradle ?建脚本使用的是
Groovy
或
Kotlin
的
特定?域?言
???的
[3]
,而不是??的
XML
。
[4]
?前官方支持的?言?
Java
、
Groovy
、
Scala
、
C++
、
Swift
、
JavaScript
等以及
Spring?架
[5]
。
使用 Gradle 的優勢
[
??
]
- 自動處理套件相依關係 - 取自 Maven Repos 的?念
- 自動處理佈署問題 - 取自 Ant 的?念
- 條件判斷寫法直覺 - 使用 Groovy 語言
過去 Java 開發者常用 Maven 和 Ant 等工具進行封裝佈署的自動化,或是兩者兼用,不過這兩個套件彼此有優缺點,如果頻繁改變相依套件版本,使用 Ant 相當麻煩,如果?碎工作?多,Maven 功能不足,而且兩者都使用 XML 描述,相當不利於設計 if、switch 等判斷式,?使寫了可讀性也不佳,而 Gradle 改良了過去 Maven、Ant 帶給開發者的問題,至今也成? Android Studio 內建的封裝佈署工具。
?念
[
??
]
?件
[
??
]
由于Gradle 的核心功能???世界提供了?少的自?化,其他?用性功能都是由?件提供
[6]
[7]
,所以往往在使用了Gradle?候,往往都?使用?件以完整自?化操作。在特定的
上下文
?境下,Gradle ?件提供?用???合适的默?事?以及?准(
?例
)。
[8]
?言之,?件是????境和上下文的一??充和?展。
使用?件分?步:解析?件、?用?件。
[9]
Gradle?件常?的?????
apply
和
plugins
,前者??是?用?件,后者是?分析又?用?件。
[9]
依??束
[
??
]
依??束(Dependency constraint),用于?助模?去?取一?可用的依?。依??束,可以?小模?的可支持版本的范?。而且?也能适用于??依?(transitive dependencies)。
[10]
示例如下:
dependencies
{
implementation
'org.apache.httpcomponents:httpclient'
constraints
{
implementation
(
'org.apache.httpcomponents:httpclient:4.5.3'
)
{
because
'之前的版本有bug,?影?到?用'
}
implementation
(
'commons-codec:commons-codec:1.11'
)
{
because
' ?httpclient?取的 1.9 版本有bug,?影?到?用'
}
}
}
?件
[
??
]
Java
[
??
]
Java Plugin
[
??
]
Java?件??目提供了Java??、??以及其他一系列功能。同?Java?件是其他
JVM?言
?件的基?。官方文?不建?使用者再直接使用Java?件,而??使用基于Java?件的衍生?件,如:java-library和application。
[11]
在java?件中,
compile
???(???依?)已???,取而代之是
implementation
???
[12]
,而在java-library中可使用
api
和
implementation
???表示依?。
[13]
Java Application?件
[
??
]
Application?件,用于?建可?行的 JVM ?用。
[11]
Java Library?件
[
??
]
Java依?包?件用于提供Java依?包的??知?。 java-library?件增加了API的?念。
implementation
和
api
?????在于:
api
所依?的依?包,?作???目的API被暴露于?用者;
implementation
所依?的依?包,不?作???目的API而暴露于?用者,?用者如果需要使用?依?包需要?外?明。
[13]
Java Platform?件
[
??
]
Java平台?件?Java生?系?提供平台的功能。平台可用于各?目的,如:
[14]
- 各?子?目使用同一?版本?和描述,?行?布。
- ?使用者提供一?推?的版本的依?包?合。
- 在不同的子?目中,共享依?版本。
Ant?移示例
[
??
]
Gradle?Ant有??密集成,甚至在?建?可以把Ant?建脚本直接?入。下面的例子展示了一???的Ant target被引入?一?Gradle task。
build.xml
<project>
<target
name=
"ant.target"
>
<echo
message=
"Running ant.target!"
/>
</target>
</project>
build.gradle
ant
.
importBuild
'build.xml'
?行
gradle ant.target
??示如下?果
> gradle ant.target
:ant.target
[ant:echo] Running ant.target!
BUILD SUCCESSFUL
?考文?
[
??
]
??
[
??
]