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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ching Yi Chan
November 29, 2015
How-to & DIY
510
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
190
twjug-lite-17 結束了幾個月的 Java Web 培訓 站在人蔘迷途的我
qrtt1
0
140
[twjug-lite] 迷你研發部 [1]
qrtt1
0
1.2k
寫個好懂的程式
qrtt1
1
670
OAuth 2.0 Authorization Code Flow
qrtt1
0
340
types of knowledge
qrtt1
1
1.4k
twjug 小活動
qrtt1
0
520
TWJUG 2019
qrtt1
0
250
Learning Concepts
qrtt1
0
290
Other Decks in How-to & DIY
See All in How-to & DIY
ボードゲーム × 専用収納 〜3Dプリントで埋めるニッチな隙間〜 / Board Games × Custom Storage
handlename
0
290
地方カンファレンスのスタッフしてて思うこと
yumechi
0
220
Azure PortalのQoLを上げてたら Big Techに怒られた
horihiro
2
600
AIをフル活用! 猫版MBTI「CATS診断」 爆速開発の裏側【個人開発のAIツール活用 LT Night 登壇用スライド】
omori0219
0
1.6k
What's the difference in taste between expensive and cheap mills? Measuring coffee particle size distribution using ImageJ
dogrunjp
0
840
JAWS-UG鹿児島2.0 reboot - JAWS-UG/AWS Communitiesのご紹介
awsjcpm
0
110
生成AIは 『コードを書く』だけじゃない アーキテクチャ設計から環境構築まで——社内データ活用DXの全貌
punipuni_mint
0
180
苦手の克服方法 / How to overcome weaknesses
toma_sm
0
390
「無理」を「コントロール」するスキル / Skills to Control "Muri"
hageyahhoo
6
4.1k
スイングやカードをいい感じに立てるスタンドの話
niccolli
1
470
LLMを「機能」として組み込む技術:「Figma to はてなCMS」におけるプロンプトエンジニアリングからAIエージェント構築にわたる精度向上の軌跡
nanimonodemonai
0
510
EXPO 2025 大屋根リングをぐるっと周回! 【GPSマルチユニット×ソラカメ実験】
scbc1167
0
130
Featured
See All Featured
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
310
Building AI with AI
inesmontani
PRO
1
1.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Rails Girls Zürich Keynote
gr2m
96
14k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Chasing Engaging Ingredients in Design
codingconduct
0
220
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
170
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
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