Rake 301

Den här sista artikeln tittar på FileList, Pathmap, CLEAN, CLOBBER och passerar argument. Dessa är inte super viktiga för nybörjare genast, men de kommer säkert att vara mycket praktiska vid ett senare tillfälle - ovärderligt verkligen.

ämnen

  • Passerar argument
  • Filelist
  • Pathmap
  • Clean & Clobber
  • För vägen

Passerar argument

Du har två alternativ för att skicka argument till Rake-uppgifter. Du kan antingen göra det genom att använda Bash-variabler eller genom att använda sig av Rake's syntax själv.

ENV Variabel

Om du inte har spelat med Bash innan-eller Bash låter som gobbledegook till dig-låt oss ta fem och börja från början. 

Bash i ditt skal erbjuder två typer av variabler: globala (aka-miljö) variabler och lokala. Båda är skrivna i stor bokstav. Miljövariablerna är globala, vilket betyder att de är tillgängliga i alla skal och inte försvinner när du stänger en till skillnad från lokala basvariabler som endast är tillgängliga i det nuvarande skalet. 

Miljövariabler kan innehålla data som kan användas av flera applikationer och används ofta som ett användbart sätt att dela konfigurationsinställningar. Till skillnad från det är lokala Bash-variabler bara det lokala. 

I vårt sammanhang att använda Rake har du möjlighet att få tillgång till både via Ruby och effektpass variabler från kommandoraden.

FYI

Precis som lite åt sidan, om du skriver env eller ENV I ditt skal får du tillgång till en hel massa miljövariabler. Jag redigerade listan, men för att bättre förstå vad miljövariabler är och vad de innehåller, uppmuntrar jag dig att köra det själv.

Skal

env

Produktion

TERM_PROGRAM = Apple_Terminal TERM = skärm-256färg SHELL = / bin / bash TMUX = / privat / var / mappar / 4z / 3np9k5ks62b1xpbn_w_lmrgh0000gr / T / tmux-504 / default, 4146,0 EDITOR = vim LANG = en_US.UTF-8 TMUX_PANE = % 1 is_vim = eko "# pane_current_command" | grep -iqE "(^ | \ / g) (se | n? vim? x?) (diff)? $" ... 

Om du vill se en lista med lokala Bash-variabler kan du springa uppsättning.

Skal

(set -o posix; set) | mindre

De uppsättning kommandot ger dig mycket mer effekt, men ovanstående visar de relevanta bitarna direkt.

Rubins ENV-klassmetod

Ruby erbjuder ett sätt att använda både miljö och lokala Bash-variabler via en hash-liknande accessor. För våra behov, när vi överför en variabel till en Rake-uppgift, kommer det att bli en lokal Bash-variabel, som du kan hitta i listan över variabler som körs uppsättning eller en variation av det. Ruby kan läsa ut det med ENV [ 'VARIABEL'].

Skal

rake prepare_book BOOKTITLE = "Confessions of a unicorn"

Vad jag vill klargöra är dock att denna variabel inte kommer att läggas till i ENV-listan som ditt system använder - de saker som du såg att ringa env från skalet. För att lägga till den i listan måste du "exportera" den. Det här är en annan historia, men jag trodde jag skulle klargöra det.

Några Rakefile

uppgift: prepare_book do book_title = ENV ['BOOKTITLE'] || "Working Title" sätter "Gör något med # book_title" slutet

I den här uppgiftsdefinitionen kan du se hur vi förberedde oss för att acceptera eller införliva variabeln som skickats till uppmaningen. Rubys ENV [BASHVARIABLE] gör allt tungt lyft. Om BOKTITEL hade varit en global miljövariabel, men vi kunde även ha tillgång till den inom denna uppgiftsdefinition med denna syntax.

Rake Parameter Syntax

Det andra tillvägagångssättet använder ren Rake-syntax. Du skickar helt enkelt variabler i fyrkantiga hängslen. Det här tillvägagångssättet är bättre, och du kan hålla sakerna mer isolerade. Varför involverar Bash om Rake är helt kapabel att hantera detta? Dessutom har du inga Bash-variabler som flyter runt den vägen. Om du vill skicka flera argument till en uppgift är det också mycket mer elegant.

Skal

rake "create_mi6_agent [James, Bond, 007]"

Några Rakefile

uppgift: create_mi6_agent, [: first_name,: last_name,: number] do | t, args | sätter "Nummer # args.number är kommandot # args.first_name # args.last_name." slutet

När du skickar in fler argument än vad du har definierat i din uppgift, kan du helt enkelt komma åt dem via args. args.extras visar en uppsättning av alla ytterligare inpassade parametrar. args.to_a visar dig alla parametrar-i en uppsättning också, förstås.

Filelist

I tidigare exempel har vi samlat in manuellt listor över filer som behöver viss omvandling. Det är tråkigt, rätt? Filelist är en av de nackdelar som gör Rake ett kraftfullt verktyg. Det är bara för lätt att definiera ett globmönster för de filer du behöver och få det automatiskt att uppdateras när du lägger till eller tar bort filer från den destinationen. Med det till vårt förfogande kan filtreringslistor vara lika raka eller så sofistikerade som vi behöver. Regelbundna uttryck är bara toppen av isberget, men mycket självklart.

Behov av listor över filer som ska behandlas är mycket vanliga för byggverktyg, och det är lätt att hantera dem som är en av styrkorna i Rake. FileList gör din Rakefile mindre, smartare och kapabel att hantera ett godtyckligt antal filer som du inte behöver hantera. Du kan lämna Rake i laddning. 

Så vad är en FileList exakt? Tänk på det som en rad filer som matchar det givna mönstret. Det är en specialiserad Ruby Array som är inriktad på bearbetning av listor med filer som lagrar dem som strängar. När de är insamlade, är de redo att duter och överför transformationer.

Några Rakefile

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

Att hantera dessa filer för hand är ett säkert sätt att bygga på sand. Och, naturligtvis, kontrollerar Rake tidstämplarna i den här listan och återuppbygger bara filer som inte är aktuella. En FileList är också lat. Det tar inga filer tills de behövs. Om du har en massa fillistor, beter sig de väldigt rena och klara på grund av det. Listorna som inte används aktivt gör det lätt utan att slå på filsystemet. Det är så effektivare.

Som du kan se nedan kan du också tillhandahålla flera globmönster för listan.

Några Rakefile

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

Med stora uppsättningar filer kommer uteslutningar mycket bra, till exempel om vi vill filtrera ut tillfälliga filer, säkerhetskopiera filer från redaktörer, Git-filer eller vissa kataloger som inte behövs. Kortfattat är uteslutningsregler för filer som du inte vill ha i din byggnad.

artiklar = Rake :: FileList.new ('_ inlägg / ** / *. markdown, md') do | files | files.exclude ('/ _ inlägg / utkast / *. markdown, md') slutet => ["_posts / published / 2016 / 2016-02-02-some-article.md", "_posts / published / 2015 / 2015/12/12-annan-article.markdown "] 

Vi kan överföra filerna i FileList genom initieraren, som accepterar en lista med filmasker. Du bearbetar eventuella undantag inom blocket. Vi förenklat listan över önskade filtillägg via markdown, md för att hålla saker torka. Du kan också kedja dessa uteslutningar så mycket som du behöver. Här kan vi även enkelt kontrollera om filerna som ingår i FileList är tomma (noll-?) och utesluta dessa från arrayen så.

artiklar = Rake :: FileList.new ('_ inlägg / ** / * .md') do | files | files.exclude ('/ _ inlägg / utkast / *. markdown, md') files.exclude ('_ inlägg / ~ *') files.exclude gör | file | File.zero?(file) änden

Vi tillhandahåller i princip flera globmönster för att samla endast filer vi behöver i FileList. Oavsett anledning kan du också gå motsatt sätt och inkludera filer i en FileList.

FL = FileList ['images / *. Png'] FL.include ('images / private / * .jpg)

Pathmap

Det är Rakes hemliga vapen och visar sin sanna kraft genom att du kan manipulera sökvägar. Det kan hämtas på en lista med filer via FileList eller på enstaka filer. Glöm inte att det fungerar på strängar. Det är en del av en förlängning av Ruby's Sträng klass.

Låt oss spela med en enkel fil och ändra en enkel anknytning. Vi kan göra det här med den praktiska ext metod, naturligtvis.

Några Ruby File

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

De ext Metoden låter oss ersätta en filtillägg ganska enkelt. Låt oss se vad vi kan göra med den här filen när vi leker med pathmap, fastän. Jag tycker att det är det bästa sättet att visa dig vad den har för dig. Vi kan uppnå samma sak som detta.

Några Rakefile

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

Som du kan se är det lite mer elegant. Vi tillhandahåller pathmap med en specifikation av vad vi behöver från den strängen via %.

  • % X

Med detta får vi allt utom filtillägget. Sedan lägger vi helt enkelt till förlängningen vi behöver. Det här är bara att skrapa ytan. pathmap har många användbara markörer som gör att du kan vara mer kreativ. Manuell hantering av filvägar kunde inte bli enklare med detta. 

  • % p

Om du behöver hela sökvägen.

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

Om du bara behöver namnet på en given sökväg. Inga kataloger men med filtillägget.

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

Om du behöver filnamn på en viss sökväg utan filändelsen.

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

Om du bara behöver listan över kataloger på en given sökväg.

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

Extraherar bara filtillägget.

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

Visar endast filseparatorn.

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

Om du vill ange ett visst antal kataloger du behöver. Praktiskt för djupt kapslade filstrukturer.

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

Du kan också närma sig den i omvänd ordning med hjälp av minus.

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

Som du kan se, hanterar den här en liten metoden alla de olika behoven du kan ha med att kartlägga en lista med filer till en annan lista med filer. Fäst den till en FileList och den magiska sparken. Det är verkligen ett kraftverktyg för att munga filnamn.

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

Här tar vi till exempel en lista med bilder och mappar dem till nya filnamn genom att extrahera filnamnen och lägga till en -tummen suffix plus den extraherade filtillägget medan du lägger dem i en tummen katalogen. Jag är säker på att du hittar mycket bra användning för pathmap.

Clean & Clobber

Vi vill kunna återställa ett projekt till ett orört tillstånd. För den delen är en FileList inte bara praktisk för att förbereda filer som ska transformeras men gör det också enkelt att samla in filer som du vill ha städat efter att du är klar med dina uppgifter. CLEAN och CLOBBER är faktiskt FileLists också-de har bara två mycket specifika jobb att hantera-Deletion.

Några Rakefile

kräva "rake / clean" CLEAN.include ('*. intermediate_files') CLOBBER.include ('*. intermediate_files', 'built_files / *')

Dessa två uppgifter är naturligtvis dumma, och du behöver mata dem fillistor via vår praktiska inkludera. När du kör rake ren eller rake clobber, Dessa samlade filer kommer att försvinna. Eftersom det här är en valfri modul måste du först kräva den i din Rakefile. Det trevliga med CLEAN och CLOBBER är att de ger dig en central plats att hantera rengöring av dina byggfiler. Visst kan du själv skriva Rake-uppgifter själv för att hantera detta, men både CLEAN och CLOBBER löser det för dig utan att uppfinna hjulet igen.

Vi sätter inte allt i en ren uppgift eftersom det är praktiskt att du kan skilja mellan mellanliggande och bygga filer. Låt oss säga att vi behövde skapa HTML-filer för att skapa slutliga PDF-versioner av våra Markdown-filer. Vi skulle inkludera HTML-filerna i vår RENA lista. Både .html och finalen .pdf filer skulle gå in i GREJOR. Konceptuellt ska CLOBBER-listan ta bort allt i båda listorna.

Varför bryr vi oss om dessa byggfiler? Ibland vill du bygga om allt och torka ut gamla filer för att få en helt ny byggnad. Därför behöver du ett sätt att ta bort alla filer som genererades samtidigt som du behåller källfilerna som behövs för de flesta filer som oftast är under versionskontroll. Det är enkelt för dessa listor att bli föråldrad när du löser detta manuellt. Därför hanterar dem som vår goda gamla vän FileList denna process mycket effektivare.

För vägen

  • Komponenter 

Rake är i själva verket för att hantera uppgifter, förstås. Bryt dem ner till deras mest användbara komponentdelar och bygga dem upp för att skapa större uppgifter. Tänk OOP! Detsamma gäller för dina filer. Rails gör det här mycket enkelt för dig via uppgifter / lib. I andra projekt kan du skapa en katalog som heter rakelib och bygga dina Rake-komponenter där inne. Rake fyller Rakefile och rakelib / *. rake filer automatiskt.

  • Använder sig av rake -dry-run

Om du behöver köra en uppgift som är potentiellt destruktiv i viss mening och du vill hellre kontrollera först vad den här uppgiften skulle göra, kan du sorts sandbox uppgiften. Du kommer att se loggen över vad den gör utan filoperationerna.

  • KYSS

Håll det enkelt! Rake är smart om att göra det minsta möjliga beloppet. Så ska du vara. Det trevliga med Rake är att det ger en bra DSL utan att ge dig mycket rep för att skada dig själv genom att uppfinna hjulet onödigt.

  • namnrymder

Namnrymder är billiga och hindrar dig från att springa i motstridiga uppgiftsnamn. Detta är särskilt viktigt om du har Rakefiles som kommer från olika källor - och från flera utvecklare.

uppgift: fight_bad_dude gör ... slut namnrymd: bond gör uppgift: fight_bad_dude ... slutet slutet
  • Filmanipulationer

Använd FileUtils och håll dig borta från skalfilmanipuleringar inom dina uppgifter. Det är lite smutsigt när Rake gör dem redan direkt tillgängliga för dig.

  • Ruby kommandon

Du kan köra Ruby-filer i Rake-filer. Det kan komma till nytta varje gång i taget.

uppgift: some_task gör ruby ​​'ruby_program.rb' slutet
  • Dynamiskt genererade uppgifter

Använd regler om du har mycket filer istället för dynamiskt genererade uppgifter. Varför? Springa rake -P och du kommer att få en lista alla av dem. Det kan gå ur hand mycket, väldigt snabbt. Förutom att inte använda regler saknas ofta helt enkelt elegans. Du kanske inte har minskat mönstret till kärnan än. Viktigast av allt, detta kommer att göra återanvändning enklare samtidigt som det är torkat.

  • listor

I stället för att definiera samlingar för filer själv - och även uppdatera den här listan - låter vi Rake vara ansvarig för det. Som vi har sett är det inte alls komplicerat att samla filer för dina uppgifter i Rake. 

  • Rubin

Använd Ruby metoder för mer komplexa saker. Extrahera metoder för återanvändning vart du än kan. Bara för att vi skriver kod i Rake-filer borde det inte hindra oss från korrekt inkapsling och OOP.

  • Söka upp uppgifter

Skal

rake -T secret_service_agent

Detta kommer till exempel att söka efter rake-uppgifter med "secret_service_agent" i dem. Den matchar uppgiftsnamnet men inte beskrivningen.

rake -W create_mi6_agent

Detta visar oss var uppgiften create_mi6_agent är definierad.

Slutgiltiga tankar

Rake är en kraftfull uppgiftshantering och exekveringsmotor. Open-source-programvara bäst om du frågar mig. Först blev jag verkligen förvånad över att lära mig hur många nedladdningar den har samlat under de senaste åren. Att det här lilla byggverktyget är den mest populära pärlan hittills och har över 100 miljoner hämtningar verkar galen. 

Men när man tittar djupare på vad den har att erbjuda, blir det kristallklart i en skymning vad en mästare programvarubrännare Jim Weirich verkligen var - en riktig Ruby hjälte vi alla borde beundra för sitt arbete, arv och passion. Jag lämnar dig med en fin video intervju där Jim diskuterar Rake. Det finns massor av andra videor av hans samtal tillgängliga online. Gå och titta på dem alla!