JavaRush /Блоги Java /Random-TG /Муқаддимаи зуд ба Gradle
Viacheslav
Сатҳи

Муқаддимаи зуд ба Gradle

Дар гурӯҳ нашр шудааст

Муқаддима

Мавзӯи ин барраси системаи сохтани автоматии Gradle хоҳад буд. Дар забони англисӣ, системаҳои сохтан Tools Build номида мешаванд . Муқаддимаи зуд ба Gradle - 1Чаро ин ҳатто лозим аст? Ба таври дастӣ сохтани лоиҳаҳо дар Java як раванди хеле меҳнатталаб аст. Китобхонаҳо ва чаҳорчӯбаҳоеро, ки лоиҳа ба онҳо ниёз дорад ва лоиҳа аз он вобаста аст, дуруст нишон додан лозим аст. Дар ин ҷо шумо метавонед мақолаи олиро дар бораи Habré хонед: " Кор кардан бо Java дар сатри фармон ." Дер ё зуд шумо ба сохтани баъзе скриптҳо барои автоматикунонии ин раванд шурӯъ мекунед. Акнун тасаввур кунед, ки ҳамаи таҳиягарон дар саросари ҷаҳон ин корро мекунанд ва ҳама боз он чизеро, ки касе барои лоиҳаи худ навиштааст, менависад. Ва он гоҳ системаҳои монтажи лоиҳа пайдо шуданд, ки ин равандро автоматӣ мекунанд. Илова бар ин, аз як тараф, онҳо ба шумо имкон медиҳанд, ки лоиҳаро тавре, ки шумо мехоҳед, ҷамъ кунед, аз тарафи дигар, онҳо ба шумо асбобҳои кам ё камтар стандартӣ медиҳанд. Алтернатива ба Gradle системаи автоматии сохтани Maven мебошад. Ин ду системаи васлкунӣ, аз як тараф, гуногунанд, аммо аз тарафи дигар, онҳо як қатор монандӣ доранд. Дар вебсайти Gradle дар ин мавзӯъ мавод мавҷуд аст: " Муҳоҷират аз Мавен ба Градл ". Тавре ки дар ин дарс гуфта шудааст, Gradle ва Maven дар бораи сохтани лоиҳа нуқтаи назари гуногун доранд. Gradle ба графики вазифаҳо асос ёфтааст, ки метавонанд аз ҳамдигар вобаста бошанд. Супоришҳо як навъ корро иҷро мекунанд. Maven модели марҳилаҳои муайянеро истифода мебарад, ки ба онҳо "ҳадафҳои" муайян замима шудаанд. Ин ҳадафҳо дар он ҷое ҳастанд, ки баъзе корҳо анҷом дода мешаванд. Аммо, бо ин равишҳои гуногун, ҳарду системаи сохтани як конвенсияро риоя мекунанд ва идоракунии вобастагӣ шабеҳ аст. Барои оғози истифодаи Gradle, шумо бояд онро зеркашӣ кунед. Дар Google ё Яндекс мо ба "Gradle Build Tool" ворид мешавем ва дар натиҷаҳои аввал мо вебсайти расмии онро мебинем: https://gradle.org . Дар саҳифаи асосии Gradle истинод бо матни "Ҳуҷҷатҳо" мавҷуд аст, ки ба ҳуҷҷатҳои Gradle оварда мерасонад . Аввалан, мо бояд Gradle-ро насб кунем (Насб кунем), бинобар ин мо ба бахши " Насб кардани Gradle " -и ҳуҷҷатҳо таваҷҷӯҳ дорем. Усулҳои зиёди насбкунӣ мавҷуданд, аз ҷумла усули «кӯҳна», яъне. ба таври дастӣ (" Ба таври дастӣ насб кардан "). Тибқи дастурҳо, файли навъи " танҳо дуӣ " -ро зеркашӣ кунед, ки номаш ба монанди gradle-5.1.1-bin.zip хоҳад буд. Баъдан, бойгониро кушоед ва тағирёбандаи муҳити PATH-ро мувофиқи дастурҳо танзим кунед. Муҳим он аст, ки пас аз иҷрои дастурҳо, фармон gradle -vversionи Gradle насбшударо нишон медиҳад. Шояд мушкилоте вуҷуд дошта бошад, ки ҳангоми муайян кардани ҷойгиршавӣ, система Gradle-ро на дар ҷое, ки шумо мехоҳед, пайдо мекунад. Аз ин рӯ, дар Windows шумо метавонед ин корро кунед (дар * nix аналогҳо мавҷуданд): for %i in (gradle.bat) do @echo. %~$PATH:i Акнун, шояд мо метавонем шинос шуданро оғоз кунем.
Муқаддимаи зуд ба Gradle - 2

Оғози лоиҳаи Gradle

Ман фавран қайд кардан мехоҳам, ки Gradle дар бораи иҷрои вазифаҳое мебошад, ки вазифаҳо ном доранд (ман онҳоро вазифаҳо меномам). Вазифаҳо аз ҷониби плагинҳои гуногун таъмин карда мешаванд . Ман ба шумо маслиҳат медиҳам, ки дар бораи плагинҳо дар ҳуҷҷатҳои расмӣ бештар хонед: " Истифодаи плагинҳои Gradle ". Маҷмӯи "Плагинҳои аслӣ" вуҷуд дорад, ки ҳангоми насби Gradle ҳамеша дастрасанд. Категорияҳои гуногуни ин плагинҳо мавҷуданд, аммо мо ба категорияи " Utility " таваҷҷӯҳ дорем. Ин маҷмӯа плагини " Build Init Plugin " -ро дар бар мегирад, ки вазифаҳоро барои оғоз кардани лоиҳаи Gradle таъмин мекунад. Мо ба сохтани як намуди лоиҳа таваҷҷӯҳ дорем: " java-application ". Биёед вазифаи Gradle-ро иҷро кунем: gradle init --type java-application Биёед дар ин роҳ ба баъзе саволҳо ҷавоб диҳем, масалан, мо мехоҳем Groovy DSL (забони тавсифи вазифаҳои стандартӣ барои Gradle) ва чаҳорчӯбаи санҷиши JUnit-ро истифода барем (мо дар ин бора дар баррасии дигар сӯҳбат хоҳем кард). Пас аз эҷод, мо маҷмӯи файлҳои зеринро мегирем:
Муқаддимаи зуд ба Gradle - 3
Аввалан, пас аз оғозёбӣ мо як бастаи махсусеро мегирем, ки барои versionи мо Gradle пешакӣ танзим карда шудааст - ин скрипти махсус аст. Ман ба шумо маслиҳат медиҳам, ки бештар дар бораи он дар ҳуҷҷатҳои расмӣ - " The Gradle Wrapper " хонед. Дуюм, мо Gradle Build Script - файли build.gradle -ро мебинем. Ин файли асосӣ аст, ки тавсиф мекунад, ки кадом китобхонаҳо ва чаҳорчӯбаҳои лоиҳаи мо истифода мешаванд ва кадом плагинҳо бояд ба лоиҳа пайваст шаванд ва вазифаҳои гуногунро тавсиф мекунанд. Ман ба шумо маслиҳат медиҳам, ки бештар дар бораи ин файл дар ҳуҷҷатҳои расмӣ хонед: " Асосҳои скриптро бунёд кунед ".
Муқаддимаи зуд ба Gradle - 4

Плагинҳо ва вазифаҳо

Агар мо ҳоло ба мундариҷаи Script Build назар кунем, мо қисмати плагинҳоро мебинем:
plugins {
    id 'java'
    id 'application'
}
Инҳо ҳамон плагинҳо мебошанд, ки мо қаблан дар бораи он сӯҳбат кардем. Ва агар плагинҳо вуҷуд дошта бошанд, пас вазифаҳое ҳастанд, ки ҳоло барои мо дастрасанд. Мо метавонем фармони gradle tasks -ро иҷро кунем ва бубинем, ки ҳоло бо лоиҳа чӣ кор карда метавонем:
Муқаддимаи зуд ба Gradle - 5
Масалан, бо иҷро кардани gradle runмо синфи асосии замимаи java-и худро оғоз мекунем:
Муқаддимаи зуд ба Gradle - 6
Чи тавре ки мебинем, дар поён хамин тавр навишта шудааст 2 actionable tasks: 1 executed, 1 up-to-date Ин чй маъно дорад? Ин маънои онро дорад, ки дар маҷмӯъ 2 вазифа иҷро шудааст: Гузашта аз ин, 1-тоаш воқеан иҷро шуда буд ва яке иҷро нашудааст, зеро... замонавӣ аст, яъне давлат ҷорӣ аст ва ҳеҷ коре нашудааст. Мо метавонем ба истилоҳ "Иҷроиши хушк" -ро иҷро кунем: gradle run -m Биёед ин фармонро иҷро кунем, мо мебинем, ки барои иҷрои вазифаи иҷро кадом вазифаҳо иҷро мешаванд:
Муқаддимаи зуд ба Gradle - 7
Тавре ки мо мебинем, ҳамагӣ 4 вазифа иҷро карда шуд: пеш аз иҷро шудан, он синфҳои вазифаҳои вобастагиро иҷро мекард. Худи синфҳо 2 вобастагӣ доранд ва аз ин рӯ, он инчунин compileJava ва processResources -ро иҷро кардааст. Вақте ки мо вазифаро иҷро мекунем, мо метавонем онро ҳангоми дидани сатҳи муайяни гузоришҳо иҷро кунем (сатҳи сабткунӣ муайян мекунад, ки то чӣ андоза паёмҳои муҳимро мо дидан мехоҳем). Масалан, мо метавонем gradle run -i. Ин инчунин ба мо паёмҳои иттилоотиро нишон медиҳад, ба монанди:
Task :classes UP-TO-DATE
Skipping task ':classes' as it has no actions.
Барои маълумоти бештар дар бораи сабти ном дар Gradle, ман ба шумо маслиҳат медиҳам, ки ба ҳуҷҷатҳои расмӣ муроҷиат кунед: " Gradle Logging ". Тавре ки мо мебинем, супориши синфҳо гузаронида шуд, зеро он UP-TO-DATE аст , яъне ҳолат ҷорӣ аст, ҳеҷ кор кардан лозим нест, бинобар ин ягон амале набуд. Ин аз он сабаб аст, ки ба таври нобаёнӣ Gradle дорои " Тафтиши замонавӣ " ё сохти ба истилоҳ афзоянда мебошад. Шумо метавонед бештар дар бораи ин механизм дар ҳуҷҷатҳои Gradle хонед: " Санҷишҳои замонавӣ (AKA Incremental Build) ". Аммо ин механизмро тавассути иҷрои вазифае, ки парчами --rerun-tasks нишон медиҳад, ғайрифаъол кардан мумкин аст. Барои намуна, gradle run --rerun-tasks. Он гоҳ мо мебинем: 2 вазифаи иҷрошаванда: 2 иҷрошуда Тавре ки шумо мебинед, шумораи супоришҳои иҷрошуда танҳо сатҳи якуми графикро ба назар мегирад, яъне худи вазифаи иҷрошаванда ва он вазифаҳое, ки бевосита аз онҳо вобаста аст, яъне , синфхо. Вазифаҳое, ки аз онҳо синфҳо вобастаанд, дар ин ҷо ба ҳисоб гирифта намешаванд (ҳарчанд онҳо ҳангоми иҷрои вазифаи синфҳо иҷро мешаванд). Шумо инчунин бояд дар бораи вазифаҳо хонед:
Муқаддимаи зуд ба Gradle - 8

Вобастагӣ

Яке аз вазифаҳои асосии ҳама гуна системаи сохтмон ин идоракунии вобастагӣ мебошад, яъне китобхонаҳо/чаҳорчӯбаҳое, ки лоиҳаи мо ба он ниёз доранд. Системаи сохтмон бояд кафолат диҳад, ки онҳо дар вақти лозима дастрас бошанд ва артефакти ниҳоии барномаи моро ба таври дуруст ҷамъ оварад. Бо нобаёнӣ, пас аз gradle init барои Java-барнома, мо мундариҷаи зеринро дар скрипти сохтмон мебинем:
dependencies {
    implementation 'com.google.guava:guava:26.0-jre'
    testImplementation 'junit:junit:4.12'
}
Дар ин ҷо фавран маълум мешавад, ки мо чӣ пайваст карда истодаем. Аммо бидуни каме фаҳмиш, маълум нест, ки татбиқ ва санҷиш чист? Дар ин ҷо мо бояд дубора ба ҳуҷҷатҳои Gradle муроҷиат кунем, зеро ҳуҷҷатҳои Gradle хуб навишта шудаанд. Он " Идоракунии конфигуратсияҳои вобастагӣ " номида мешавад. Тавре ки дар ҳуҷҷатҳо гуфта шудааст, ҳар як вобастагӣ бо доираи муайян эълон карда мешавад - минтақае, ки ин вобастагӣ дар дохor он дастрас хоҳад буд. Ин миқёс бо баъзе конфигуратсияҳо таъин карда мешавад, ки ҳар яки онҳо номи беназир доранд. Инчунин ҷолиб он аст, ки бисёре аз плагинҳои Gradle конфигуратсияҳои пешакӣ муайяншударо илова мекунанд. Барои фаҳмидани кадом конфигуратсияҳое, ки мо дорем, мо метавонем иҷро кунем: gradle --console plain dependencies Бо ин роҳ мо рӯйхати ҳамаи конфигуратсияҳои дастрас ва вобастагии онҳоро мебинем. Мо метавонем ин рӯйхатро филтр кунем, то танҳо худи конфигуратсияҳои дастрасро бубинем: gradle --console plain dependencies | find " - " Мо аз куҷо медонем, ки чӣ бояд истифода шавад? Шумо бояд дар ин ҷо каме хонед. Зеро Мо плагини "Java"-ро истифода мебарем, аз ин рӯ биёед бо ҳуҷҷатҳои он ва бахши " Идоракунии вобастагӣ " оғоз кунем. Дар ин ҷо мо мебинем, ки қаблан конфигуратсияе вуҷуд дошт (микроми дигар) бо номи "компиляция" ва он маънои "вобастагии ҳангоми таҳия заруриро" дошт. Аммо он гоҳ он (ба забони англисӣ иваз карда шуд) бо татбиқ иваз карда шуд. Шумо метавонед бештар дар бораи ивазкунӣ дар қисмати " API ва ҷудокунии татбиқ " хонед. Маълум мешавад, ки ин вобастагӣ ба "компилей classpath" хоҳад буд. Аммо баъзан мо мехоҳем, ки вобастагии мо ба артефакти ниҳоӣ дохил карда шавад. Барои чӣ? Масалан, мо як кӯзаи иҷрошаванда дорем, ки он бояд ҳама чизи заруриро дар бар гирад. Пас мо бояд чӣ кор кунем? Аввалан, чунин дастгирӣ "аз қуттӣ" вуҷуд надорад (яъне, бо нобаёнӣ, бе ягон амали иловагӣ). Ин бо он шарҳ дода мешавад, ки ҳама мехоҳанд архивро ба таври худ ҷамъоварӣ кунанд ва Градл кӯшиш мекунад, ки минималистӣ бошад. Мо инчунин наметавонем архивҳои jar дар роҳи синфро истифода барем (бе коркарди иловагӣ дар code), зеро он ин тавр кор намекунад (Барои тафсилоти бештар нигаред ба " Oracle: Илова кардани синфҳо ба Classpath файли JAR "). Аз ин рӯ, роҳи зеботарин ин рамзи зерин дар скрипти сохтмон аст:
jar {
    manifest {
        attributes 'Main-Class': 'jrgradle.App'
    }
    from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
Дар танзимоти вазифаи jar мо муайян мекунем, ки ба манифести файли jar чӣ илова карда мешавад (ниг. " Oracle: Танзими нуқтаи вуруди барнома "). Ва он гоҳ мо мегӯем, ки ҳамаи вобастагиҳое, ки барои тартиб додан лозим буданд, ба зарф дохил карда мешаванд. Алтернатива ин аст, ки " Plugin Gradle Shadow " истифода шавад. Ин метавонад мураккаб ба назар расад, аммо плагинҳои дигар метавонанд ҳаётро осон кунанд. Масалан, ҳангоми сохтани веб-барнома (бар хилофи як замимаи муқаррарии java), мо як плагини махсусро истифода мебарем - “ Gradle War Plugin ”, ки рафтори дигар дорад ва зиндагии мо дар он ҷо осонтар хоҳад шуд (тамоми вобастагии зарурӣ аз ҷониби худи плагин дар феҳристи махсуси алоҳида ҷойгир карда мешавад. Чунин кор аз рӯи сохтори барномаҳои веб танзим карда мешавад. Аммо ин як ҳикояи тамоман дигар аст).
Муқаддимаи зуд ба Gradle - 9

Натиҷаҳо

Gradle интихоби хубест барои системаҳои сохтани лоиҳа. Инро он далел тасдиқ мекунад, ки онро таҳиягарони чунин лоиҳаҳои маъруф ба монанди Spring ва Hibernate истифода мебаранд. Дар боло танҳо чизҳои асосӣ баррасӣ карда шуданд. Дар паси онҳо миллионҳо хусусият ва имкониятҳое, ки таҳиягарон доранд, пинҳон шудаанд. Gradle инчунин эҷоди лоиҳаҳои бисёрмодулро дастгирӣ мекунад, ки дар ин баррасӣ фаро гирифта нашудаанд, аммо худи Gradle як дастури аъло дорад: " Эҷоди сохтани бисёр лоиҳаҳо ". Ман умедворам, ки ин барраси инчунин нишон дод, ки ҳуҷҷатҳои Gradle дар 5+ навишта шудаанд ва шумо метавонед ба осонӣ чизҳои лозимаро пайдо кунед, агар шумо фаҳмед, ки ба куҷо ҷустуҷӯ кунед. Ва ин вақте меояд, ки шумо асосҳоро фаҳмед. Илова бар ин, Gradle дорои дарсҳои олӣ мебошад. Ман мехоҳам бо як рӯйхати хурди он чизеро, ки шумо бо истифода аз Gradle дидан мумкин аст, ба анҷом расонам:
Муқаддимаи зуд ба Gradle - 10
#Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION