Rake 301

Acest articol final privește FileList, Pathmap, CLEAN, CLOBBER și argumentele de trecere. Acestea nu sunt foarte importante pentru începători imediat, dar cu siguranță vor veni foarte folositori într-un moment mai de neprețuit.

Subiecte

  • Trecerea Argumentelor
  • Filelist
  • Pathmap
  • Clean & Clobber
  • Pentru drum

Trecerea Argumentelor

Aveți două opțiuni pentru a transmite argumente în sarcinile Rake. Puteți să o faceți fie prin utilizarea variabilelor Bash, fie prin utilizarea sintaxei lui Rake.

Variabilă ENV

În cazul în care nu ați mai jucat cu Bash înainte - sau Bash suna ca un gobbledegook pentru tine - să luăm cinci și să începem de la început. 

Bash din coajă oferă două tipuri de variabile: variabilele globale (aka mediu) și cele locale. Ambele sunt scrise cu majuscule. Variabilele de mediu sunt globale, ceea ce înseamnă că ele sunt disponibile în toate cochilii și nu dispăreau atunci când închideți una - spre deosebire de variabilele locale Bash, care sunt disponibile numai în shell-ul curent. 

Variabilele de mediu pot conține date care pot fi utilizate de mai multe aplicații și sunt adesea folosite ca modalitate de a partaja setările de configurare. În contrast cu aceasta, variabilele locale Bash sunt doar cele locale. 

În contextul nostru de utilizare a Rake-ului, aveți abilitatea de a accesa atât prin Ruby, cât și prin transferul variabilelor din linia de comandă.

FYI

Doar ca un pic deoparte, dacă tastați env sau ENV în coajă, veți avea acces la o grămadă de variabile de mediu. Am redactat lista, dar pentru a înțelege mai bine ce variabile de mediu sunt și ce includ ele, vă încurajez să o rulați pentru dvs..

Coajă

env

producție

TERM_PROGRAM = Apple_Terminal TERM = ecranul-256color SHELL = / bin / bash TMUX = / privat / var / foldere / 4z / 3np9k5ks62b1xpbn_w_lmrgh0000gr / T / tmux-504 / implicit, 4146,0 EDITOR = vim LANG = en_US.UTF-8 TMUX_PANE = % 1 este_vim = echo "# pane_current_command" | grep -iqE "(^ | \ /) g? (vezi | n? vim? x?) (diff)? $" ... 

Dacă doriți să vedeți o listă de variabile locale Bash, puteți rula a stabilit.

Coajă

(set -o posix; set) Mai puțin

a stabilit comanda vă oferă mult mai multă putere, dar cele de mai sus vă arată imediat biții relevanți.

Rubrica din clasa ENV

Ruby oferă o modalitate de a utiliza variabilele de mediu și locale Bash, deopotrivă, printr-un accesoriu de tip hash. Pentru nevoile noastre, atunci când trecem o variabilă la o sarcină Rake, va fi o variabilă locală Bash, pe care o puteți găsi în lista de variabile care rulează a stabilit sau o variantă a acesteia. Ruby îl poate citi ENV [ 'VARIABLE'].

Coajă

rake prepare_book BOOKTITLE = "Confesiunile unui unicorn"

Ceea ce vreau să clarific, totuși, este că această variabilă nu se va adăuga la lista ENV folosită de sistem - lucrurile pe care le-ați văzut apelând env din coajă. Pentru ao adăuga la lista respectivă, va trebui să o "exportați". Aceasta este o altă poveste, dar am crezut că ar trebui să fac acest lucru clar.

Unele Rakefile

sarcină: prepare_book do book_title = ENV ['BOOKTITLE'] || "Titlu de lucru" pune "Faceți ceva cu capătul # book_title"

În această definiție a sarcinii, puteți vedea modul în care am pregătit să acceptăm sau să încorporăm variabila transmisă invocării sarcinii. Ruby ENV [BASHVARIABLE] face toate ridicările grele. Dacă TITLUL CARTII a fost o variabilă de mediu globală, deși am fi putut să-l accesăm și în această definiție a sarcinii cu această sintaxă.

Rata de sintaxă a parametrilor

A doua abordare este folosirea sintaxei pure Rake. Pur și simplu treceți variabilele în bretele pătrate. Această abordare este mai bună și puteți menține lucrurile mai izolate. De ce implică Bash dacă Rake este perfect capabil să se ocupe de asta? În plus, nu aveți variabile Bash care plutesc în acest fel. Dacă doriți să treceți mai multe argumente într-o sarcină, este și mai elegantă.

Coajă

rake "create_mi6_agent [James, Bond, 007]"

Unele Rakefile

sarcină: create_mi6_agent, [: first_name,: last_name,: number] do | t, args | pune "Numărul # args.number este comandantul # args.first_name # args.last_name." Sfârșit

Când treceți mai multe argumente decât le-ați definit în sarcina dvs., le puteți accesa pur și simplu prin intermediul acestora args. args.extras afișează o gamă de parametri suplimentari parcurși. args.to_a vă arată toți parametrii - și într-o matrice, bineînțeles.

Filelist

În exemplele anterioare, am colectat manual liste de fișiere care necesită o transformare. E plictisitor, corect? Filelist este una dintre acele minunate care face Rake un instrument puternic. Este prea ușor să definiți un model glob pentru fișierele de care aveți nevoie și să îl actualizați în mod automat atunci când adăugați sau ștergeți fișiere din acea destinație. Cu aceasta, listele de filtrare pot fi la fel de simple sau de sofisticate de câte ori avem nevoie. Expresiile regulate sunt doar vârful aisbergului - desi foarte util, desigur.

Aveți nevoie de liste de fișiere de procesat, care sunt foarte frecvente pentru a construi unelte, iar ușurința de a face față este una dintre punctele forte ale rakei. FileList vă face ca Rakefile-ul să fie mai mic, mai inteligent și capabil să gestioneze un număr arbitrar de fișiere pe care nu trebuie să le gestionați. Poți lăsa Rake-ul la conducere. 

Deci, ce este exact un FileList? Gândiți-vă la aceasta ca la o serie de fișiere care se potrivesc cu modelul dat. Este un Ruby Array specializat care se concentrează pe procesarea listelor de fișiere - stocându-le ca șiruri de caractere. Odată colectate, ele sunt pregătite pentru a vă repeta și a aplica transformări.

Unele Rakefile

image_list = FileList ['images / * .png'] => ["images / jim-weirich.png", "imagini / zen-rake.png"]

Gestionarea acestor fișiere manual este o modalitate sigură de a construi pe nisip. Și, bineînțeles, Rake verifică marcajele de timp ale acestei liste și reconstruiește numai fișierele care sunt învechite. Un FileList este și leneș. Nu apucă fișierele până nu sunt necesare. Dacă aveți o mulțime de liste de fișiere, acestea se comportă foarte sănătoase și inteligente din cauza asta. Listele care nu se utilizează în mod activ o iau ușor fără să lovească sistemul de fișiere. E mai eficient în acest fel.

După cum puteți vedea mai jos, puteți oferi și mai multe modele globale pentru listă.

Unele Rakefile

image_list = FileList ['images / * .png', 'images / *. jpg'] => ["images / happy-jim.jpg", images / jim-weirich.png, imagini / zen-rake. png "]

Cu seturi mari de fișiere, excluderile vin foarte folositoare - de exemplu, dacă vrem să filtram fișiere temporare, fișiere de rezervă de la editori, fișiere Git sau anumite directoare care nu sunt necesare. Pe scurt, regulile de excludere sunt pentru fișierele pe care nu le doriți în construirea dvs..

articole = Rake :: FileList.new ('_ posts / ** / *. markdown, md') nu | fisiere | files.exclude ('/ _ posts / drafts / *. markdown, md') end => ["_posts / publicat / 2016 / 2016-02-02-some-article.md" 2015-12-12-un alt-article.markdown "] 

Putem trece fișierele FileList prin intermediul inițializatorului, care acceptă o listă de măști de fișiere. Procesați toate excluderile din bloc. Am simplificat lista de extensii de fișiere dorite prin markdown, md pentru a păstra lucrurile DRY. De asemenea, puteți lăsa aceste excluderi la fel de mult ca și dvs. Aici am putea verifica chiar dacă fișierele incluse în FileList sunt goale (zero?) și excludeți-le din matrice în acest fel.

articole = Rake :: FileList.new ('_ posts / ** / *. md') nu | fișiere | files.exclude ('/ _ posts / drafts / *. markdown, md') fișiere.exclude ('_ posts / ~ *') files.exclude do | file | File.zero?(file) sfârșitul final

În principiu oferim mai multe modele globale pentru colectarea în fișierul de fișiere a fișierelor de care avem nevoie. Din orice motiv, puteți merge și în sens opus și puteți include fișiere într-un fișier de fișiere.

FL = FileList ['images / * .png'] FL.include ('imagini / private / *. Jpg)

Pathmap

Este arma secretă a Rake-ului și își arată adevărata sa putere, permițându-vă să manipulați căile de fișiere. Acesta poate fi apelat pe o listă de fișiere prin FileList sau pe fișiere unice, de asemenea. Nu uitați însă că funcționează pe șiruri de caractere. Face parte dintr-o extensie a lui Ruby Şir clasă.

Să jucăm cu un fișier simplu și să schimbăm o extensie simplă. Am putea face acest lucru cu ajutorul lui ext metoda, desigur.

Unele fișiere Ruby

"/mi6/q/secret_gadgets.xml".ext("html") # => '/mi6/q/secret_gadgets.html'

ext ne permite să înlocuim o extensie de fișier destul de ușor. Să vedem ce putem face cu acest fișier când jucăm pathmap, deşi. Cred că este cel mai bun mod de a vă arăta ce are de grijă. Putem realiza același lucru ca acesta.

Unele Rakefile

"/mi6/q/secret_gadgets.xml".pathmap('%X.html ') # =>' /mi6/q/secret_gadgets.html '

După cum puteți vedea, este un pic mai elegant. Noi oferim pathmap cu specificarea a ceea ce avem nevoie de acel șir prin intermediul %.

  • %X

Folosind acest lucru, obținem totul, cu excepția extensiei de fișier. Apoi pur și simplu adăugăm extensia de care avem nevoie. Dar asta este doar zgârierea suprafeței. pathmap are o mulțime de indicatori utile care vă permit să vă creați mai mult. File manipularea calea nu ar putea fi mai ușor cu asta. 

  • % p

Dacă aveți nevoie de calea completă.

"/mi6/q/secret_gadgets.xml".pathmap('%p ') # =>" mi6 / q / secret_gadgets.xml "
  • % f

Dacă aveți nevoie doar de numele unei căi date. Nu există directoare, ci extensia de fișiere.

"/mi6/q/secret_gadgets.xml".pathmap('%f ') # =>" secret_gadgets.xml "
  • % n

Dacă aveți nevoie de un nume de fișier al unei anumite căi fără extensia fișierului.

"/mi6/q/secret_gadgets.xml".pathmap('%n ') # =>" secret_gadgets "
  • % d

Dacă aveți nevoie doar de lista directoarelor unei anumite căi.

"/mi6/q/secret_gadgets.xml".pathmap('%d ') # =>" mi6 / q "
  • %X

Extrage numai extensia de fișier.

"/mi6/q/secret_gadgets.xml".pathmap('%x ') # =>" .xml "
  • % s

Vă arată doar separatorul de fișiere.

"/mi6/q/secret_gadgets.xml".pathmap('%s ') # =>" / "
  • % nd

Dacă doriți să specificați un număr specific de directoare de care aveți nevoie. Folosit pentru structuri de fișiere adânc imbricate.

"/mi6/q/secret_gadgets.xml".pathmap('%1d ') # =>" mi6 "
"/mi6/q/secret_gadgets.xml".pathmap('%2d ') # =>" mi6 / q "

De asemenea, puteți să o abordați în ordine inversă utilizând un minus.

"/mi6/q/secret_gadgets.xml".pathmap('%-2d ') # =>" mi6 / q "
"/mi6/q/secret_gadgets.xml".pathmap('%.1d ') # =>" q "

După cum puteți vedea, această mică metodă abordează toate diferitele nevoi pe care le puteți avea cu maparea unei liste de fișiere într-o altă listă de fișiere. Atașați-o la un FileList și magia da lovituri. Este într-adevăr un instrument de putere pentru numele de fișiere munging.

imagini = FileList ['images / * .png'] thumbs = images.pathmap ('thumbs /% n-thumbs% x')

Aici, de exemplu, luăm o listă de imagini și cartografindu-le pe nume de fișiere noi extragând numele de fișiere și adăugând -degetele sufixul, plus extensia de fișier extras, în timp ce le puneți într-un degetele director. Sunt sigur că veți găsi o utilizare foarte bună pentru pathmap.

Clean & Clobber

Vrem să putem reîntoarce un proiect într-un stat curat. De altfel, un fișier de fișiere este nu numai la îndemână pentru pregătirea fișierelor care urmează să fie transformate, ci facilitează și colectarea fișierelor pe care doriți să le curățați după ce ați terminat sarcinile. CLEAN și CLOBBER sunt, de fapt, Fișiere de fișiere, de asemenea - au doar două locuri de muncă foarte specifice pentru a gestiona - Deletion.

Unele Rakefile

solicitați "rake / clean" CLEAN.include ('*. intermediar_files') CLOBBER.include ('* .mediar_files', 'built_files / *')

Aceste două sarcini sunt prost, desigur, și trebuie să le alimentați listele de fișiere prin intermediul nostru la îndemână include. Când alergi rake clean sau rake clobber, aceste fișiere colectate vor dispărea. Deoarece acesta este un modul opțional, trebuie să îl solicitați mai întâi în Rakefile. Lucru frumos despre CLEAN și CLOBBER este că vă dau un loc central pentru a vă ocupa de curățarea fișierelor dvs. de construire. Sigur, puteți scrie manual sarcini Rake pentru a rezolva această problemă, dar atât CLEAN, cât și CLOBBER vă rezolvă problema fără a reinventa roata.

Nu punem totul într-o sarcină curată, deoarece este utilă să puteți diferenția între fișierele intermediare și cele de construire. Să presupunem că este necesar să creați fișiere HTML pentru a crea versiuni PDF finale ale fișierelor noastre Markdown. Vom include fișierele HTML în fișierele noastre CURAT listă. Amandoua .html și finală .pdf fișierele ar intra în rescrie. Din punct de vedere conceptual, lista CLOBERE ar trebui să elimine totul în ambele liste.

De ce ne pasă de aceste fișiere de construire? Uneori doriți să reconstruiți totul și să ștergeți fișiere vechi pentru a obține o construcție nouă. Prin urmare, aveți nevoie de o modalitate de a șterge toate fișierele generate, păstrând în același timp fișierele sursă necesare pentru cele mai des construite fișiere aflate sub controlul versiunii. Este ușor ca aceste liste să fie depășite când rezolvați acest lucru manual. Prin urmare, manipularea lor ca vechiul prieten vechi FileList face acest proces mult mai eficient.

Pentru drum

  • Componente 

Rake, în esență, este pentru gestionarea sarcinilor, desigur. Împărțiți-le până la piesele componente cele mai utile și construiți-le pentru a crea sarcini mai mari. Gândiți-vă la OOP! Același lucru este valabil și pentru fișierele dvs. Rails face acest lucru foarte ușor pentru tine via sarcini / lib. În alte proiecte, puteți crea un director numit rakelib și construiți componentele Rake acolo. Rake-ul încarcă Rakefile și rakelib / *. grebla fișiere în mod automat.

  • Utilizarea rake-run-dry

Dacă trebuie să executați o sarcină care este potențial distructivă într-un anumit sens și doriți mai degrabă să verificați mai întâi ce va face această sarcină, aveți posibilitatea să sortați sandbox sarcina. Veți vedea jurnalul a ceea ce face fără operațiunile de fișiere.

  • SĂRUT

Nu te complica! Rake-ul este inteligent să facă cantitatea minimă posibilă. Deci, ar trebui să fii. Lucru frumos despre Rake este că oferă un DSL minunat fără să vă dea multă coardă pentru a vă face rău reinventând roata inutil.

  • Spații de nume

Spațiile de nume sunt ieftine și vă împiedică să fugiți în nume de sarcini conflictuale. Acest lucru este important în special dacă aveți rachete care provin din surse diferite - și de la mai mulți dezvoltatori.

sarcina: fight_bad_dude do ... end namespace: bond face sarcina: fight_bad_dude ... end end
  • File manipulări

Utilizați FileUtils și stați departe de manipularea fișierelor în interiorul sarcinilor. Este puțin murdar atunci când Rake le face deja disponibile direct.

  • Comenzile lui Ruby

Puteți rula fișierele Ruby în fișierele Rake. Asta ar putea fi util la fiecare o dată.

sarcina: some_task do ruby ​​'ruby_program.rb' final
  • Activități generate dinamic

Utilizați regulile dacă aveți o mulțime de fișiere în loc de sarcini generate dinamic. De ce? Alerga rake -P și veți obține o listă cu toate acestea. Asta poate ieși din mână foarte, foarte repede. În afară de aceasta, nefolosirea de reguli este deseori lipsită de eleganță. S-ar putea să nu fi redus modelul până la nucleul său încă. Cel mai important, acest lucru va face ca reutilizarea să fie mai ușoară în timp ce este DRY, desigur.

  • liste

În loc să definiți singur colecțiile pentru fișiere - și, de asemenea, să actualizați această listă - mai degrabă l-am lăsa pe Rake să se ocupe de asta. După cum am văzut, colectarea fișierelor pentru sarcinile dvs. nu este deloc complicată în Rake. 

  • Rubin

Folosiți metodele Ruby pentru lucruri mai complexe. Extrageți metode de reutilizare oriunde puteți. Doar pentru că scriem cod în fișierele Rake, nu ar trebui să ne împiedice încapsularea corectă și POO.

  • Sarcini de căutare

Coajă

rake -T secret_service_agent

Aceasta, de exemplu, va căuta sarcini rake cu "secret_service_agent" în ele. Se potrivește cu numele sarcinii, dar nu cu descrierea.

rake -W create_mi6_agent

Acest lucru ne arată unde este sarcina create_mi6_agent este definit.

Gândurile finale

Rake este un motor puternic de gestionare a sarcinilor și de execuție. Software-ul open-source la cele mai bune, dacă mă întrebi. La început, am fost cu adevărat surprins să aflu câte descărcări au acumulat în ultimii ani. Că acest mic instrument de construcție este cel mai popular Gem până în prezent și are peste 100 de milioane de descărcări pare nebun. 

Dar când te uiți mai mult la ceea ce are de oferit, devine limpede cu claritate într-o clipă ce a fost într-adevăr un scriitor de software Jim Weirich - un adevărat erou Ruby pe care toți ar trebui să-l admirăm pentru munca, moștenirea și pasiunea sa. Te las cu un interviu frumos unde Jim discută despre Rake. Există multe alte videoclipuri ale convorbirilor sale disponibile online. Du-te să-i urmăriți pe toți!

Cod