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.
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.
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.
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.
env
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
.
(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 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']
.
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.
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.
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.
rake "create_mi6_agent [James, Bond, 007]"
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.
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.
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.
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)
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.
"/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.
"/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
.
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.
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.
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.
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.
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.
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
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.
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
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.
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.
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.
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.
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!