Rake 301

Denne siste artikkelen ser på FileList, Pathmap, CLEAN, CLOBBER og passerer argumenter. Disse er ikke super viktige for nybegynnere med en gang, men de vil sikkert komme inn på et senere tidspunkt - uvurderlig egentlig.

emner

  • Passerende argumenter
  • Filelist
  • Pathmap
  • Clean & Clobber
  • Til veien

Passerende argumenter

Du har to alternativer for å sende argumenter til Rake-oppgaver. Du kan enten gjøre det ved å bruke Bash-variabler eller ved å bruke Rake's syntaks selv.

ENV variabel

Hvis du ikke har spilt med Bash før-eller Bash høres ut som gobbledegook til deg-la oss ta fem og starte fra begynnelsen. 

Bash i skallet ditt tilbyr to typer variabler: globale (aka miljø) variabler og lokale. Begge er skrevet i store versjoner. Miljøvariablene er globale, noe som betyr at de er tilgjengelige i alle skall og ikke forsvinner når du lukker en ulik lokal Bash-variabel, som bare er tilgjengelig i nåværende skall. 

Miljøvariabler kan inneholde data som kan brukes av flere applikasjoner, og brukes ofte som en nyttig måte å dele konfigurasjonsinnstillinger med. I motsetning til det er lokale Bash-variabler bare det lokale. 

I vår sammenheng med å bruke Rake har du muligheten til å få tilgang til både via Ruby og effektpass variabler fra kommandolinjen.

FYI

Akkurat som en liten side, hvis du skriver env eller ENV I skallet ditt får du tilgang til en hel masse miljøvariabler. Jeg redigerte listen, men for en bedre forståelse av hva miljøvariabler er og hva de inkluderer, oppfordrer jeg deg til å kjøre det selv.

Shell

env

Produksjon

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

Hvis du vil se en liste over lokale Bash-variabler, kan du kjøre sett.

Shell

(sett -o posix; sett) | mindre

De sett kommando gir deg mye mer utgang, men ovenstående viser deg de relevante bitene med en gang.

Ruby er ENV klasse metode

Ruby tilbyr en måte å bruke miljø og lokale Bash-variabler på, via en hash-like accessor. For våre behov, når vi sender en variabel til en Rake-oppgave, blir det en lokal Bash-variabel, som du finner i listen over variabler som kjører sett eller en variant av det. Ruby kan lese det ut med ENV [ 'VARIABEL'].

Shell

rake prepare_book BOOKTITLE = "Confessions of a unicorn"

Hva jeg vil gjøre klart er imidlertid at denne variabelen ikke blir lagt til ENV-listen som systemet bruker - de tingene du så ringe til env fra skallet. For å legge til den i listen, må du "eksportere" den. Dette er en annen historie, men jeg trodde jeg skulle gjøre det klart.

Noen Rakefile

oppgave: prepare_book do book_title = ENV ['BOOKTITLE'] || "Working Title" setter "Gjør noe med # book_title" slutten

I denne oppgavedefinisjonen kan du se hvordan vi forberedte oss til å akseptere eller innlemme variabelen som er overført til oppgavens anrop. Rubys ENV [BASHVARIABLE] gjør alt tungt løft. Hvis BOKTITTEL hadde vært en global miljøvariabel, men vi kunne også ha tilgang til den i denne oppgavedefinisjonen også med denne syntaksen.

Rake Parameter Syntax

Den andre tilnærmingen bruker ren Rake-syntaks. Du passerer bare variabler i firkantede bånd. Denne tilnærmingen er bedre, og du kan holde ting mer isolert. Hvorfor involvere Bash hvis Rake er perfekt i stand til å håndtere dette? Pluss at du ikke har noen Bash-variabler som flyter rundt den måten. Hvis du vil overføre flere argumenter til en oppgave, er det også mye mer elegant.

Shell

rake "create_mi6_agent [James, Bond, 007]"

Noen Rakefile

Oppgave: create_mi6_agent, [: first_name,: last_name,: number] do | t, args | setter "Nummer # args.number er kommandør # args.first_name # args.last_name." slutt

Når du sender inn flere argumenter enn du har definert i oppgaven, kan du bare få tilgang til dem via args. args.extras viser en rekke av alle de tilleggsdefinerte parametrene. args.to_a viser deg alle parametrene-i en rekke også, selvfølgelig.

Filelist

I tidligere eksempler har vi manuelt samlet inn lister over filer som trenger litt transformasjon. Det er kjedelig, ikke sant? Filelist er en av de niceties som gjør Rake til et kraftig verktøy. Det er bare for enkelt å definere et glob mønster for filene du trenger, og få det automatisk oppdatert når du legger til eller sletter filer fra den destinasjonen. Med det vi har til rådighet, kan filtreringslister være like grei eller så sofistikert som vi trenger. Regelmessige uttrykk er bare toppen av isfjellet, selv om det er veldig praktisk.

Nødvendige lister over filer som skal behandles, er svært vanlige for byggeverktøy, og det gjør det enkelt å håndtere dem en av styrken til Rake. FileList gjør Rakefile mindre, smartere og i stand til å håndtere et vilkårlig antall filer som du ikke trenger å administrere. Du kan la Rake være ansvarlig. 

Så hva er en FileList nøyaktig? Tenk på det som en rekke filer som samsvarer med det oppgitte mønsteret. Det er en spesialisert Ruby Array som fokuserer på å behandle lister over filer, og lagrer dem som strenge. Når de er samlet, er de klare for å iterere over og å bruke transformasjoner.

Noen Rakefile

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

Å håndtere disse filene for hånd er en sikker måte å bygge på sand. Og selvfølgelig sjekker Rake tidsstemplene i denne listen og gjenoppbygger kun filer som er utdaterte. En FileList er også lat. Det tar ikke filer inntil de trengs. Hvis du har en mengde fillister, oppfører de seg veldig sane og smarte på grunn av det. Lister som ikke blir aktivt brukt, gjør det enkelt uten å trykke på filsystemet. Det er mer effektivt på den måten.

Som du kan se nedenfor, kan du også gi flere globmønstre for listen.

Noen Rakefile

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

Med store sett med filer kommer utelukkelser veldig praktisk, for eksempel hvis vi vil filtrere ut midlertidige filer, sikkerhetskopiere filer fra redaktører, Git-filer eller bestemte kataloger som ikke er nødvendige. Kort sagt er ekskluderingsregler for filer som du ikke vil ha i byggingen din.

artikler = Rake :: FileList.new ('_ posts / ** / *. markdown, md') do | files | files.exclude ('/ _ innlegg / utkast / *. markdown, md') end => ["_posts / published / 2016 / 2016-02-02-some-article.md", "_posts / published / 2015 / 2015-12-12-annen-article.markdown "] 

Vi kan sende filene i FileList gjennom initieringsprogrammet, som aksepterer en liste over filmasker. Du behandler eventuelle unntak i blokken. Vi forenklet listen over ønskede filutvidelser via markdown, md å holde ting tørr. Du kan også koble disse ekskluderingene så mye du trenger. Her kan vi til og med sjekke om filene som er inkludert i FileList er tomme (null?) og ekskludere disse fra arrayen på den måten.

artikler = Rake :: FileList.new ('_ posts / ** / * .md') do | files | files.exclude ('/ _ innlegg / utkast / *. markdown, md') files.exclude ('_ innlegg / ~ *') files.exclude do | file | File.zero?(file) slutten

Vi leverer i utgangspunktet flere globmønstre for å samle kun filer vi trenger i FileList. Uansett grunn kan du også gå motsatt måte og inkludere filer i en FileList.

FL = FileList ['bilder / * .png'] FL.include ('bilder / privat / * .jpg)

Pathmap

Det er det hemmelige våpenet av Rake og viser sin sanne kraft ved at du kan manipulere filbaner. Det kan kalles på en liste over filer via FileList eller på enkle filer også. Ikke glem at det fungerer på strenger, skjønt. Det er en del av en utvidelse av Ruby's string klasse.

La oss spille med en enkel fil og endre en enkel utvidelse. Vi kunne gjøre dette med det praktiske ext metode, selvsagt.

Noen Ruby File

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

De ext Metoden lar oss erstatte en filtillegg ganske enkelt. La oss se hva vi kan gjøre med denne filen når vi leker med pathmap, selv om. Jeg tror det er den beste måten å vise deg hva den har i butikken for deg. Vi kan oppnå det samme som dette.

Noen Rakefile

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

Som du kan se, er dette litt mer elegant. Vi sørger for pathmap med en spesifikasjon av hva vi trenger fra den strengen via %.

  • % X

Ved å bruke dette får vi alt annet enn filtypen. Da legger vi bare til utvidelsen vi trenger. Dette er bare å skrape overflaten, skjønt. pathmap har mange nyttige markører som lar deg være kreativere. Filbane manipulasjoner kan ikke være enklere med dette. 

  • % p-

Hvis du trenger den komplette banen.

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

Hvis du bare trenger navnet på en gitt sti. Ingen kataloger, men med filtypen.

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

Hvis du trenger filnavn på en gitt sti uten filtypenavn.

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

Hvis du bare trenger en liste over kataloger av en gitt sti.

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

Extracts bare filtypen.

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

Viser kun filseparatoren.

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

Hvis du vil angi et bestemt antall kataloger du trenger. Praktisk for dypt nestede filstrukturer.

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

Du kan også nærme den i omvendt rekkefølge ved å bruke en minus.

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

Som du kan se, håndterer denne lille metoden alle de ulike behovene du kan ha med å kartlegge en liste over filer til en annen liste med filer. Fest den til en FileList og den magiske sparken. Det er virkelig et kraftverktøy for munging filnavn.

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

Her tar vi for eksempel en liste over bilder og kartlegger dem til nye filnavn ved å pakke ut filnavnene og legge til en -tommelen suffiks pluss den ekstraherte filutvidelsen mens du setter dem i en tommelen katalogen. Jeg er sikker på at du vil finne veldig god bruk for pathmap.

Clean & Clobber

Vi ønsker å kunne returnere et prosjekt til en uberørt tilstand. For øvrig er en FileList ikke bare praktisk for prepping filer som skal forvandles, men gjør det også enkelt å samle filer som du vil ha renset etter at du er ferdig med oppgavene dine. CLEAN og CLOBBER er faktisk fillister også - de har bare to svært spesifikke jobber for å håndtere-sletting.

Noen Rakefile

krever 'rake / clean' CLEAN.include ('*. intermediate_files') CLOBBER.include ('*. intermediate_files', 'built_files / *')

Disse to oppgavene er selvfølgelig dumme, og du trenger å mate dem fillister via vår praktiske inkludere. Når du kjører rake ren eller rake clobber, disse samlefilene vil forsvinne. Siden dette er en valgfri modul, må du først kreve det i Rakefile. Det fine med CLEAN og CLOBBER er at de gir deg et sentralt sted å håndtere å rengjøre byggfiler. Selvfølgelig kan du selv skrive Rake-oppgaver selv for å håndtere dette, men både REN og KLOBBER løser det for deg uten å gjenoppfinne hjulet.

Vi setter ikke alt i en ren oppgave fordi det er praktisk at du kan skille mellom mellomliggende og byggefiler. La oss si at vi trengte å lage HTML-filer for å kunne lage endelige PDF-versjoner av våre Markdown-filer. Vi vil inkludere HTML-filene i vår REN liste. Begge .html og den endelige .pdf filer ville gå inn i clobber. Konseptuelt skal CLOBBER-listen fjerne alt i begge lister.

Hvorfor bryr vi oss om disse byggefilene? Noen ganger vil du gjenoppbygge alt og tørke ut gamle filer for å få en helt nybygg. Derfor trenger du en måte å slette alle filene som ble generert mens du beholdt kildefilene som trengs for de fleste filene som er under versjonskontroll. Det er enkelt for disse lister å bli utdatert når du løser dette manuelt. Derfor håndterer dem som vår gode gamle venn FileList denne prosessen mye mer effektiv.

Til veien

  • komponenter 

Rake, i sin essens, er for å styre oppgaver, selvfølgelig. Bryt dem ned til de mest nyttige komponentbitene og bygg dem opp for å skape større oppgaver. Tenk OOP! Det samme gjelder for filene dine. Rails gjør dette veldig enkelt for deg via oppgaver / lib. I andre prosjekter kan du opprette en katalog som heter rakelib og bygg Rake-komponentene dine der inne. Rake laster Rakefile og rakelib / *. rake filer automatisk.

  • Ved hjelp av rake - tørrkjøring

Hvis du trenger å kjøre en oppgave som er potensielt destruktiv i en viss forstand, og du vil heller sjekke først hva denne oppgaven ville gjøre, kan du sortere sandkassen oppgaven. Du vil se loggen over hva den gjør uten filoperasjonen.

  • KYSSE

Hold det enkelt! Rake er smart om å gjøre det minste mulige. Så burde du være. Den fine tingen om Rake er at den gir en flott DSL uten å gi deg mye tau for å skade deg selv ved å gjenoppfinne hjulet unødvendig.

  • navnerom

Navnegrupper er billige og hindrer deg i å løpe i motstridende oppgavenavn. Dette er spesielt viktig hvis du har Rakefiles som kommer fra forskjellige kilder - og fra flere utviklere.

oppgave: fight_bad_dude gjør ... sluttnavnsområde: bond gjør oppgave: fight_bad_dude ... slutten
  • Filmanipulasjoner

Gjør bruk av FileUtils og hold deg borte fra shell filmanipulasjoner i oppgavene dine. Det er litt skittent når Rake gjør dem allerede direkte tilgjengelige for deg.

  • Ruby kommandoer

Du kan kjøre Ruby-filer i Rake-filer. Det kan komme til nytte hver eneste gang.

oppgave: some_task gjør ruby ​​'ruby_program.rb' slutten
  • Dynamisk genererte oppgaver

Bruk regler hvis du har mange filer i stedet for dynamisk genererte oppgaver. Hvorfor? Løpe rake -P og du vil få en liste alle sammen. Det kan gå veldig raskt, veldig raskt. Dessuten mangler ikke bruk av regler ganske enkelt eleganse. Du har kanskje ikke redusert mønsteret til kjerne ennå. Viktigst, dette vil gjøre gjenbruk lettere mens du er tørr, selvfølgelig.

  • lister

I stedet for å definere samlinger for filer selv - og også å oppdatere denne listen - vil vi heller la Rake være ansvarlig for det. Som vi har sett, er det ikke komplisert å samle filer for oppgavene i Rake. 

  • Rubin

Benytt deg av Ruby-metoder for mer komplekse ting. Trekk ut metoder for gjenbruk uansett hvor du kan. Bare fordi vi skriver kode i Rake-filer, bør det ikke hindre oss fra riktig innkapsling og OOP.

  • Søke oppgaver

Shell

rake -T secret_service_agent

Dette vil for eksempel søke etter rakeoppgaver med "secret_service_agent" i dem. Den samsvarer med oppgavens navn, men ikke beskrivelsen.

rake -W create_mi6_agent

Dette viser oss hvor oppgaven er create_mi6_agent er definert.

Siste tanker

Rake er en kraftig oppgavebehandling og utførelsesmotor. Open-source programvare på sitt beste, hvis du spør meg. Først var jeg virkelig overrasket over å lære hvor mange nedlastinger den har samlet i de siste par årene. At dette lille byggeverktøyet er den mest populære perlen til dato, og som har over 100 millioner nedlastinger, virker gal. 

Men når du ser dypere inn i hva den har å tilby, blir det krystallklart i en jiffy, hva en mester programvare forfatter Jim Weirich virkelig var - en ekte Ruby helt vi alle bør beundre for sitt arbeid, arv og lidenskap. Jeg gir deg et godt videointervju der Jim diskuterer Rake. Det er tonnevis med andre videoer av hans samtaler tilgjengelig på nettet. Gå se på dem alle!