Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JCConf2015: groovy to gradle
Search
Ching Yi Chan
November 29, 2015
How-to & DIY
530
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JCConf2015: groovy to gradle
info:
https://github.com/qrtt1/JCConf2015_from_groovy_to_gradle
Ching Yi Chan
November 29, 2015
More Decks by Ching Yi Chan
See All by Ching Yi Chan
[coscup] Reading and modifying the source code of the dbt adapter
qrtt1
0
200
twjug-lite-17 結束了幾個月的 Java Web 培訓 站在人蔘迷途的我
qrtt1
0
150
[twjug-lite] 迷你研發部 [1]
qrtt1
0
1.2k
寫個好懂的程式
qrtt1
1
680
OAuth 2.0 Authorization Code Flow
qrtt1
0
340
types of knowledge
qrtt1
1
1.5k
twjug 小活動
qrtt1
0
530
TWJUG 2019
qrtt1
0
260
Learning Concepts
qrtt1
0
300
Other Decks in How-to & DIY
See All in How-to & DIY
ModuleLLM、最前線!
anoken
1
390
ドローンをAWSで制御してみた
nagi900
0
180
ボードゲーム × 専用収納 〜3Dプリントで埋めるニッチな隙間〜 / Board Games × Custom Storage
handlename
0
340
おっきなガジェットの回線事情
2bo
1
240
MustをWillに変える技術 〜アイドル・郁田はるきが"すべき"の壁を超えるまで〜
subroh0508
1
2k
2025版 鯖落ちパーツで安価に機械学習用マシンを作ってみる
bobfromjapan
0
990
Trying "Vibe No-code/Low-code" with MCP #noderedjp
n0bisuke2
0
160
Node-REDで制御できるエッジカメラのreCameraを触る #iotlt #JLCPCB #recamera
n0bisuke2
0
200
私がカンファレンスのプロポーザルを書くときに考えていること
kotomin_m
1
780
スマートハウスの蓄電性能の効率化を実現してみた~電気自動車編~
runrunsan
0
560
「変えること」「変わること」を楽しむ力で"敵わない存在"と向き合う
subroh0508
2
2.6k
JAWS-UG鹿児島2.0 reboot - JAWS-UG/AWS Communitiesのご紹介
awsjcpm
0
130
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
220
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Why Our Code Smells
bkeepers
PRO
340
58k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Paper Plane
katiecoart
PRO
2
53k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Transcript
由 GROOVY 到 GRADLE qrtt1 #JCConf
忙碌的開發者 ‧ 哪有時間看書呢!?看官網應該就夠了唄! ‧ 換上 Android Studio 它就在了!什麼?你說那東西 叫 Gradle
? ‧ 總是在網路上的茫茫大海找 Gradle 秘技 ‧ Gradle 文件看了,好像懂了,又好像沒懂
試著學一下 Gradle
簡單來說 ‧ 知道怎麼安裝(Android Studio User:竟然要安裝!) ‧ 知道怎麼寫 task ‧ 知道怎麼編譯
java 專案 ‧ 懂得相依管理 ‧ (那 Android Developer 咧!?) ‧ (那 Android Developer 咧!?) ‧ (那 Android Developer 咧!?)
CH6.1 基本 Script 教學 ‧ Gradle Script 由二個基本概念構成 ‧ project:含
1 個或多個 project ‧ task:每個 project 可以有 0 個或多個 task
CH6.2 Hello World task hello { doLast { println 'Hello
world!' } } ͜taskᗫᒟοd່֛อٙtask
CH6.2 Hello World task hello { doLast { println 'Hello
world!' } } Ύ׳ɓଡ଼{}ΎᄳࡈdoLastΎɓࡈ{}n ଣ༆Ѣᗭ©
CH6.3 Hello World task hello << { println 'Hello world!'
} Νᅵ͜taskᗫᒟοn Ύ̋ɪ << ڛ৺lЫᒔ݊Ⴍʕ˖ыlk
CH6.4 Script are code task upper << { String someString
= 'mY_nAmE' println "Original: " + someString println "Upper case: " + someString.toUpperCase() } task count << { 4.times { print "$it " } } ್ܝۤlk
CH6.5 Task Dependencies task hello << { println 'Hello world!'
} task intro(dependsOn: hello) << { println "I'm Gradle" } ᐏอҦঐdண֛taskԱᗫڷ
CH6.6 Dynamic Task 4.times { counter -> task "task$counter" <<
{ println "I'm task number $counter" } } 《重新認識你的 int》Groovy 萬物皆物件 repeat methodၾgroovy closure ঐᓃྼٙ͜؇Гlk
CH6.7 Dynamic Task task hello << { println 'Hello Earth'
} hello.doFirst { println 'Hello Venus' } hello.doLast { println 'Hello Mars' } hello << { println 'Hello Jupiter' } ڋኪ٫ࡁl ᒔᅟɨ̘k
CH6.9 Extra Task properties task myTask { ext.myProperty = "myValue"
} task printTaskProperties << { println myTask.myProperty }
CH6.10 Using Ant Task task loadfile << { def files
= file('../antLoadfileResources').listFiles().sort() files.each { File file -> if (file.isFile()) { ant.loadfile(srcFile: file, property: file.name) println " *** $file.name ***" println "${ant.properties[file.name]}" } } } ο˄ʃlఱ݊ʔࠠࠅ ତί
CH6.11 Using Methods task checksum << { fileList('../antLoadfileResources').each {File file
-> ant.checksum(file: file, property: "cs_$file.name") println "$file.name Checksum: ${ant.properties["cs_$file.name"]}" } } task loadfile << { fileList('../antLoadfileResources').each {File file -> ant.loadfile(srcFile: file, property: file.name) println "I'm fond of $file.name" } } File[] fileList(String dir) { file(dir).listFiles({ file -> file.isFile() }as FileFilter).sort() } ࠅᄳNFUIPEɰБဈl
CH6.13 Configure by DAG gradle.taskGraph.whenReady {taskGraph -> if (taskGraph.hasTask(release)) {
version = '1.0' } else { version = '1.0-SNAPSHOT' } }
你會 Gradle 了!
還有 Gradle DSL
要繼續下一關嗎? GOTO CH7
我不想懂,它能動就好 ً࿒ᜑͪjඟʾʊ৬ɳ
ʔࠅ在官網上學 Gradle
如果有時間...
讀後心得 ‧ Groovy 真是個兼容各家懶人語法的語言 ‧ 理解 Gradle DSL 可以先由 Groovy
Feature 開始
基本認知 ‧Gradle Script 就是 Groovy Script ‧Gradle Script 即為 Groovy
DSL ‧蝦毁!要學新的語言!? ‧Groovy 相容於『大部分』Java 語法 ‧Groovy 能省略 () 與 ; ‧支援 Closure (Code Block)
Groovy 常用語法 In Gradle อ ‧ Bean 自動產生 setter/getter ‧
常用容器 List 與 Map 直接在語法上支援 ‧ 具有 Closure 的設計,能取代匿名類別的常用情景 ‧ 配合 () 省略,讓 Closure 寫起來像 method body
Groovy 常用語法 In Gradle อ http://www.groovy-lang.org/syntax.html def colors = [
red: '#FF0000', green: '#00FF00', blue: '#0000FF'] def map = [:] optional typing 懶得寫 type 就用 def (其實就是 Object) 看到 [] 就是容器, 看到 : 就是 Map new HashMap()
Groovy 常用語法 In Gradle อ http://www.groovy-lang.org/syntax.html def numbers = [1,
2, 3] 看到 [] 就是容器,看到,又沒寫 type 就是 List String[] arrStr = ['Ananas', 'Banana', 'Kiwi'] new ArrayList()
Groovy 常用語法 In Gradle อ http://www.groovy-lang.org/syntax.html ["hello", "world"].each({ println it
}) {} 放在參數列或被當成變數內容,就是 Closure 物件 it 是預設的參數名稱 ["hello", “world"].each({ elem -> println elem }) 可以變更參數名稱,用 -> 隔開就行了
Groovy 常用語法 In Gradle อ file("build.gradle").withReader { reader -> reader.eachWithIndex
{ it, line -> println "${line+1} $it" } } 語法省略 () 的效果,讓 Closure 看起來像 Method Body 所以,實作 DSL 時,常把 Closure 參數放在最後 1 個
Groovy 常用語法 In Gradle อ apply plugin: 'java' sourceSets {
main { java { exclude 'some/unwanted/package/**' } } } 這是 Map sourceSets 調整是 Closure & Method Invoke
《欣賞一下 Groovy Code》 001_bean.groovy 002_collection.groovy
‧ Closure 支援 delegate 機制 task copyDocs(type: Copy) { from
'src/main/doc' into 'build/target/doc' } \^DMPTVSFਗ਼ྼЪEFMFHBUFഗ$PQZ https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/Copy.html Groovy DSL Features
《欣賞一下 Groovy Code》 003_closure.groovy
‧ Compiler 提供可客製化的 AST Transformations ‧ 對 gradle 來說 ‧
task 是 keyword 用來宣告新的 task ‧ helloworld 是 task 名稱 ‧ 對 groovy 來說 ‧ task 是個 method invoke (呼叫 Script 的 BaseClass) ‧ helloworld 是 method 的參數,也是未定義的變數 task helloworld << { println 'Hello World' } Groovy DSL Features
‧ AST Transformations:處理 task method invoke task helloworld << {
println 'Hello World' } 透過 AST Transformation 轉成 task("helloworld") https://github.com/gradle/gradle/blob/master/subprojects/core/src/main/groovy/org/gradle/groovy/scripts/internal/ TaskDefinitionScriptTransformer.java Groovy DSL Features
Groovy DSL Features ‧ 支援 Meta Programming (透過 MOP 的
method hooking 機制)。讓你在 build script 可以 access 到 plugin 新增的 method 或是 properties apply plugin: 'java' sourceCompatibility = 1.8 targetCompatibility = 1.8 manifest {} sourceSets {} Ϟซཀމʡჿவჿᄳঐਗk https://docs.gradle.org/current/javadoc/org/gradle/api/ Project.html#property(java.lang.String) MetaObjectProtocol
《欣賞一下 Groovy Code》 004_mop.groovy
‧ Compiler 支援 DSL 設定 scriptBaseClass Groovy DSL Features build.gradle
file(…) .scriptBaseClass = ProjectScript.class Project .file(…) (MOP Method Hooks)
目前為止的新知 ‧ Gradle DSL 出現的 {} 大部分都是 Closure ‧ Closure
可透過指定 delegate 來委派實作 ‧ 看到 [] 就想到容器,看到 [] 內有 : 就是個 Map 容 器,單獨看到 : 也要想到是個 Map
目前為止的新知 ‧ build script 的 scriptBaseClass 是 ProjectScript ‧ ProjectScript
透過 MOP 委派工作給 Project 物件 ‧ Project 提供常用 method 並透過 MOP 委派 method invoke 或 properties access 給其它物件 ‧ task 關鍵字會被轉換為 task method,而 task name 轉為字串傳入
讓我們再重來一次 GOTO CH6
CH6.2 Hello World task hello { doLast { println 'Hello
world!' } } ͜taskᗫᒟοd່֛อٙtask
task hello { doLast { println 'Hello world!' } }
CH6.2 Hello World ͜ task 關鍵字,會被 AST 轉為 task method。 hello 會被轉為字串,作為 task method 的參數
task hello { doLast { println 'Hello world!' } }
CH6.2 Hello World ͜ 依據 build script 的 baseClass 最終將工作委派給 Project 物件,預期能在它上面找到相關 method
task hello { doLast { println 'Hello world!' } }
CH6.2 Hello World ͜ 它應該對應到下面哪一個 task method 呢?
task hello { doLast { println 'Hello world!' } }
CH6.2 Hello World ͜ 前 2 組有 Map<String, ?>,但在 Script 沒出現:
task hello { doLast { println 'Hello world!' } }
CH6.2 Hello World ͜ 第 3 組只有唯一的 name 參數, 而第 4 組有 name, closure。 符合看到 {} 幾乎是 closure
task hello { doLast { println 'Hello world!' } }
CH6.2 Hello World ટഹdҢࡁԸพ֛வଡ଼DMPTVSF QSPKFDUܔࡈUBTLيܝdխ̣DPOGJHVSF˙ج
task hello { doLast { println 'Hello world!' } }
CH6.2 Hello World EP-BTU݊ምٙNFUIPEճk ΫซɓɨDMPTVSFEFMFHBUF 《用 gradle 做個小實驗》 வ݊DPOGJHVSFDMPTVSF
CH6.3 Hello World task hello << { println 'Hello world!'
} Νᅵ͜taskᗫᒟοn Ύ̋ɪ << 《繼續看 gradle 實作》
CH6.5 Task Dependencies task intro(dependsOn: hello) << { println "I'm
Gradle" } 它應該對應到下面哪一個 task method 呢? வ݊.BQ
‧ build script 透過 baseClass 委派 ProjectScript ‧ ProjectScript 透過
MOP 委派 Project ‧ Project 透過 MOP 委派給「中介物件」 ‧ ExtensibleDynamicObject 重塑 Gradle 的世界觀 Project 物件中的 property 或 method 的 resolver
《Property Scope:How gradle resolve property》 ExtensibleDynamicObject https://github.com/gradle/gradle/blob/master/subprojects/core/src/main/groovy/org/gradle/api/internal/ExtensibleDynamicObject.java Project 的 javadoc
有寫: ο˄ʃlఱ݊ʔࠠࠅ ᐼʘdʹഗ&YUFOTJCMF%ZOBNJD0CKFDU ఱ࿁əl ତί
CH7.2.3 Customizing the project Chapter 7. Java Quickstart sourceCompatibility =
1.5 version = '1.0' manifest { attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version } ExtensibleDynamicObject java plugin class JavaPluginConvention { def sourceCompatibility def version def manifest(Closure) {} } 將 domain object 註冊為 convention 透過 project 的 extensible-dynamic-object 設定 domain object
你會 Gradle 了!
由 groovy 到 gradle ‧ 透過理解 groovy 語法與 DSL feature
培養另一種 看待 gradle 的「審美觀」(視角) ‧ 透過閱讀 gradle 程式碼取得比「文件」更直接的訊 息,而理解 gradle 的運作方式 ‧ gradle 內還有許多精巧的設計,是 groovy DSL 之 外的部分需深入研究,但只要把握著它最終會透過 groovy DSL 實現,就無需有太多的憂慮
Q&A