Rake 301

Dit laatste artikel gaat in op FileList, Pathmap, CLEAN, CLOBBER en passerende argumenten. Deze zijn niet meteen super belangrijk voor beginners, maar ze zullen zeker van pas komen op een later punt - echt van onschatbare waarde.

Onderwerpen

  • Argumenten passeren
  • FileList
  • Pathmap
  • Schoon en Clobber
  • Voor onderweg

Argumenten passeren

U hebt twee opties om argumenten door te geven aan Rake-taken. U kunt dit doen door Bash-variabelen te gebruiken of door zelf de syntaxis van Rake te gebruiken.

ENV-variabele

Als je nog niet eerder met Bash hebt gespeeld - of Bash klinkt als Gobbledegook - laten we er vijf nemen en vanaf het begin beginnen. 

Bash in je shell biedt twee soorten variabelen: globale (alias omgeving) variabelen en lokale variabelen. Beide zijn geschreven in hoofdletters. De omgevingsvariabelen zijn globaal, wat betekent dat ze beschikbaar zijn in alle shells en niet verdwijnen als je er een sluit - in tegenstelling tot lokale Bash-variabelen, die alleen beschikbaar zijn in de huidige shell. 

Omgevingsvariabelen kunnen gegevens bevatten die door meerdere applicaties kunnen worden gebruikt en worden vaak gebruikt als een handige manier om configuratie-instellingen te delen. In tegenstelling daarmee zijn lokale Bash-variabelen alleen dat, lokaal. 

In onze context van het gebruik van Rake hebt u de mogelijkheid om zowel via Ruby als in feite passvariabelen via de opdrachtregel te benaderen.

ter info

Even een beetje terzijde, als je typt env of ENV in je shell krijg je toegang tot een hele reeks omgevingsvariabelen. Ik heb de lijst geredigeerd, maar voor een beter begrip van wat omgevingsvariabelen zijn en wat ze bevatten, moedig ik je aan om het voor jezelf uit te voeren.

schelp

env

uitgang

TERM_PROGRAM = Apple_Terminal TERM = scherm-256kleur SHELL = / bin / bash TMUX = / privé / var / mappen / 4z / 3np9k5ks62b1xpbn_w_lmrgh0000gr / T / tmux-504 / standaard, 4146,0 EDITOR = vim LANG = en_US.UTF-8 TMUX_PANE = % 1 is_vim = echo "# pane_current_command" | grep -iqE "(^ | \ /) g? (weergave | n? vim? x?) (diff)? $" ... 

Als u een lijst met lokale Bash-variabelen wilt zien, kunt u uitvoeren reeks.

schelp

(set -o posix; instellen) | minder

De reeks commando geeft je veel meer output, maar het bovenstaande toont je meteen de relevante bits.

Ruby's ENV Class-methode

Ruby biedt een manier om zowel omgeving- als lokale Bash-variabelen via een hash-achtige accessor te gebruiken. Voor onze behoeften, wanneer we een variabele doorgeven aan een Rake-taak, wordt dit een lokale Bash-variabele, die u kunt vinden in de lijst met variabelen die wordt uitgevoerd reeks of een variant ervan. Ruby kan het voorlezen met behulp van ENV [ 'Variable'].

schelp

rake prepare_book BOOKTITLE = "Bekentenissen van een eenhoorn"

Wat ik echter wil verduidelijken, is dat deze variabele niet wordt toegevoegd aan de ENV-lijst die uw systeem gebruikt-de dingen die u zag aanroepen env van de schaal. Om het aan die lijst toe te voegen, zou je het moeten "exporteren". Dit is een ander verhaal, maar ik dacht dat ik dit duidelijk moest maken.

Wat Rakefile

task: prepare_book do book_title = ENV ['BOOKTITLE'] || 'Working Title' zet "Doe iets met de # book_title" einde

In deze taakdefinitie kunt u zien hoe we ons hebben voorbereid om de variabele die is doorgegeven aan de taakaanroep te accepteren of op te nemen. Ruby's ENV [BASHVARIABLE] doet al het zware werk. Als BOEK TITEL was een globale omgevingsvariabele, maar we hadden er ook binnen deze taakdefinitie toegang toe kunnen krijgen met deze syntaxis.

Hepparametersyntaxis

De tweede benadering is pure Rake-syntaxis gebruiken. Je geeft variabelen gewoon door in vierkante haakjes. Die aanpak is beter en je kunt de dingen meer geïsoleerd houden. Waarom Bash betrekken als Rake hier perfect mee om kan gaan? Bovendien heb je geen Bash-variabelen die op die manier rondzweven. Als je meerdere argumenten wilt doorgeven aan een taak, is het ook een stuk eleganter.

schelp

rake "create_mi6_agent [James, Bond, 007]"

Wat Rakefile

taak: create_mi6_agent, [: first_name,: last_name,: number] do | t, args | zet "Number # args.number is commandant # args.first_name # args.last_name." einde

Wanneer u meer argumenten doorgeeft dan u in uw taak hebt gedefinieerd, kunt u eenvoudig toegang krijgen via args. args.extras geeft een array van alle extra ingevoerde parameters weer. args.to_a toont u alle parameters - natuurlijk ook in een array.

FileList

In voorgaande voorbeelden hebben we handmatig lijsten met bestanden verzameld die enige transformatie nodig hebben. Dat is vervelend, goed? FileList is een van die aardigheidjes die van Rake een krachtig hulpmiddel maken. Het is gewoon te gemakkelijk om een ​​glob-patroon te definiëren voor de bestanden die u nodig hebt en om het automatisch up-to-date te houden wanneer u bestanden van die bestemming toevoegt of verwijdert. Met dat tot onze beschikking kunnen filterlijsten net zo rechtlijnig of verfijnd zijn als we nodig hebben. Reguliere expressies zijn slechts het topje van de ijsberg, hoewel erg handig natuurlijk.

Het is heel gebruikelijk om lijsten met te verwerken bestanden te maken, en het gemakkelijk maken om ermee om te gaan is een van de sterke punten van Rake. FileList maakt uw Rakefile kleiner, slimmer en in staat om een ​​willekeurig aantal bestanden te verwerken die u niet hoeft te beheren. Je kunt Rake de leiding geven. 

Dus wat is een FileList precies? Zie het als een reeks bestanden die overeenkomen met het gegeven patroon. Het is een gespecialiseerde Ruby-array die is gericht op het verwerken van lijsten met bestanden en deze opslaat als tekenreeksen. Zodra ze zijn verzameld, zijn ze klaar om opnieuw te worden doorgevoerd en transformaties toe te passen.

Wat Rakefile

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

Het manueel beheren van deze bestanden is een zekere manier om op zand te bouwen. En natuurlijk controleert Rake de tijdstempels van deze lijst en herbouwt alleen bestanden die verouderd zijn. Een FileList is ook lui. Het pakt geen bestanden totdat ze nodig zijn. Als je een heleboel bestandslijsten hebt, gedragen ze zich daardoor heel gezond en slim. De lijsten die niet actief worden gebruikt, nemen het rustig aan zonder het bestandssysteem te raken. Het is efficiënter op die manier.

Zoals u hieronder kunt zien, kunt u ook meerdere glob-patronen voor de lijst opgeven.

Wat Rakefile

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

Met grote sets bestanden zijn uitsluitingen erg handig, bijvoorbeeld als we tijdelijke bestanden willen filteren, back-upbestanden van editors, Git-bestanden of bepaalde mappen die niet nodig zijn. Kortom, uitsluitingsregels zijn voor bestanden die u niet wilt in uw build.

articles = Rake :: FileList.new ('_ berichten / ** / *. markdown, md') do | bestanden | files.exclude ('/ _ posts / drafts / *. markdown, md') end => ["_posts / published / 2016 / 2016-02-02-some-article.md", "_posts / published / 2015 / 2015/12/12-een-article.markdown "] 

We kunnen de bestanden van de FileList doorgeven via de initialisator, die een lijst met bestandsmaskers accepteert. U verwerkt eventuele uitsluitingen binnen het blok. We hebben de lijst met gewenste bestandsextensies vereenvoudigd via markdown, md om dingen DROOG te houden. U kunt deze uitsluitingen ook zoveel als nodig koppelen. Hier kunnen we zelfs gemakkelijk controleren of de bestanden in de FileList leeg zijn (nul?) en sluit deze op die manier uit.

articles = Rake :: FileList.new ('_ berichten / ** / *. md') do | bestanden | files.exclude ('/ _ berichten / concepten / *. markdown, md') files.exclude ('_ berichten / ~ *') files.exclude do | file | File.zero?(file) end-end

We bieden in feite meerdere glob-patronen om alleen de bestanden te verzamelen die we nodig hebben in de FileList. Om welke reden dan ook, kunt u ook de tegenovergestelde weg inslaan en bestanden opnemen in een FileList.

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

Pathmap

Het is het geheime wapen van Rake en toont zijn ware kracht door u in staat te stellen bestandspaden te manipuleren. Het kan ook via FileList of in afzonderlijke bestanden op een lijst met bestanden worden opgeroepen. Vergeet echter niet dat het op snaren werkt. Het maakt deel uit van een extensie van Ruby's Draad klasse.

Laten we spelen met een eenvoudig bestand en een eenvoudige extensie wijzigen. We zouden dit handig kunnen doen ext methode, natuurlijk.

Sommige Ruby-bestanden

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

De ext methode laat ons een bestandsextensie vrij gemakkelijk vervangen. Laten we eens kijken wat we met dit bestand kunnen doen als we met ons spelen pathmap, though. Ik denk dat dat de beste manier is om je te laten zien wat het voor jou in petto heeft. We kunnen hetzelfde als dit bereiken.

Wat Rakefile

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

Zoals u kunt zien, is dit iets eleganter. Wij voorzien pathmap met een specificatie van wat we nodig hebben van die string via %.

  • %X

Hiermee gebruiken we alles behalve de bestandsextensie. Vervolgens voegen we gewoon de extensie toe die we nodig hebben. Dit is echter net aan het oppervlak krabben. pathmap heeft veel nuttige markeringen waarmee je creatiever kunt zijn. Manipulatie van bestanden kan hiermee niet eenvoudiger. 

  • % p

Als je het volledige pad nodig hebt.

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

Als je alleen de naam van een bepaald pad nodig hebt. Geen mappen maar met de bestandsextensie.

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

Als u de bestandsnaam van een bepaald pad nodig hebt zonder de extensie.

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

Als u alleen de lijst met mappen van een bepaald pad nodig heeft.

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

Haalt alleen de bestandsextensie.

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

Toont alleen het bestandsscheidingsteken.

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

Als u een specifiek aantal mappen wilt opgeven dat u nodig hebt. Handig voor diep genestelde bestandsstructuren.

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

Je kunt het ook in omgekeerde volgorde benaderen door een minus te gebruiken.

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

Zoals u kunt zien, behandelt deze ene kleine methode alle verschillende behoeften die u kunt hebben bij het toewijzen van één lijst met bestanden aan een andere lijst met bestanden. Bevestig het aan een FileList en de magie komt in actie. Het is echt een krachtig hulpmiddel voor het munderen van bestandsnamen.

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

Hier nemen we bijvoorbeeld een lijst met afbeeldingen en koppelen deze aan nieuwe bestandsnamen door de bestandsnamen te extraheren en een -duimen achtervoegsel plus de uitgepakte bestandsextensie terwijl u ze in een duimen directory. Ik weet zeker dat je er heel goed gebruik van zult vinden pathmap.

Schoon en Clobber

We willen een project naar een ongerepte staat kunnen terugsturen. Een FileList is trouwens niet alleen handig voor het voorbereiden van bestanden die moeten worden getransformeerd, maar maakt het ook gemakkelijk om bestanden te verzamelen die u wilt opschonen nadat u klaar bent met uw taken. CLEAN en CLOBBER zijn eigenlijk ook FileLists; ze hebben slechts twee zeer specifieke taken om te verwerken: verwijderen.

Wat Rakefile

vereisen 'hark / clean' CLEAN.include ('*. intermediate_files') CLOBBER.include ('* intermediate_files', 'built_files / *')

Deze twee taken zijn natuurlijk dom en je moet ze bestandslijsten voeden via onze handige omvatten. Wanneer je rent hark schoon of rake clobber, deze verzamelde bestanden zullen verdwijnen. Aangezien dit een optionele module is, moet u deze eerst in uw Rakefile nodig hebben. Het leuke van CLEAN en CLOBBER is dat ze je een centrale plek geven om met het schoonmaken van je buildbestanden om te gaan. Natuurlijk kun je zelf Rake-taken zelf schrijven om dit aan te pakken, maar zowel CLEAN als CLOBBER lossen het voor je op zonder het wiel opnieuw uit te vinden.

We plaatsen niet alles in een schone taak, omdat het handig is dat u een onderscheid kunt maken tussen tussenliggende en build-bestanden. Stel dat we HTML-bestanden moeten maken om uiteindelijke PDF-versies van onze Markdown-bestanden te maken. We zouden de HTML-bestanden opnemen in onze SCHOON lijst. Beide .html en de finale .pdf bestanden zouden ingaan afranselen. Conceptueel is de CLOBBER-lijst verondersteld alles in beide lijsten te verwijderen.

Waarom geven we om deze build-bestanden? Soms wil je alles opnieuw opbouwen en oude bestanden wissen om een ​​gloednieuwe build te krijgen. Daarom hebt u een manier nodig om alle bestanden te verwijderen die zijn gegenereerd terwijl u de bronbestanden bewaart die nodig zijn voor de build-meest vaak bestanden die onder versiebeheer staan. Het is gemakkelijk om deze lijsten te laten verouderen wanneer u dit handmatig oplost. Daarom is het verwerken van deze bestanden als onze goede oude vriend FileList veel effectiever.

Voor onderweg

  • Components 

Rake is in wezen bedoeld voor het beheren van taken, natuurlijk. Breek ze af op hun meest nuttige stukjes en bouw ze op om grotere taken te maken. Denk OOP! Hetzelfde geldt voor je bestanden. Rails maakt dit heel gemakkelijk voor u via taken / lib. In andere projecten kunt u een opgeroepen map maken rakelib en bouw hier je Rake-componenten in. Rake laadt de Rakefile en rakelib / *. rake bestanden automatisch.

  • Gebruik makend van hark - droogloop

Als je een taak moet uitvoeren die op een of andere manier potentieel destructief is en je liever eerst wilt controleren wat deze taak zou doen, kun je de taak een beetje sandboxen. U zult het logboek zien van wat het doet zonder de bestandsbewerkingen.

  • KUS

Hou het simpel! Rake is slim over het minimale bedrag dat mogelijk is. Zo zou je ook moeten zijn. Het leuke van Rake is dat het een geweldige DSL biedt zonder je veel touw te geven om jezelf te verwonden door het wiel nodeloos opnieuw uit te vinden.

  • namespaces

Namespaces zijn goedkoop en voorkomen dat u tegenstrijdige namen van taken tegenkomt. Dit is vooral belangrijk als je Rakefiles hebt die afkomstig zijn van verschillende bronnen - en van meerdere ontwikkelaars.

task: fight_bad_dude do ... end namespace: bond do task: fight_bad_dude ... end end
  • Bestandsmanipulaties

Maak gebruik van FileUtils en blijf uit de buurt van shell-bestandsmanipulaties binnen uw taken. Het is een beetje vies als Rake ze al direct voor jou beschikbaar maakt.

  • Ruby-commando's

U kunt Ruby-bestanden binnen Rake-bestanden uitvoeren. Dat kan van tijd tot tijd van pas komen.

taak: some_task do ruby ​​'ruby_program.rb' einde
  • Dynamisch gegenereerde taken

Gebruik regels als u veel bestanden hebt in plaats van dynamisch gegenereerde taken. Waarom? Rennen hark -P en je krijgt een lijst allemaal. Dat kan heel, heel snel uit de hand lopen. Daarnaast ontbreekt het vaak niet aan regels om elegantie te gebruiken. Misschien heb je het patroon nog niet tot zijn kern gereduceerd. Het belangrijkste is dat dit hergebruik gemakkelijker maakt terwijl het DROOG is natuurlijk.

  • lijsten

In plaats van zelf collecties voor bestanden te definiëren en deze lijst bij te werken, laten we Rake liever de leiding nemen. Zoals we hebben gezien, is het verzamelen van bestanden voor je taken helemaal niet ingewikkeld in Rake. 

  • Robijn

Maak gebruik van Ruby-methoden voor meer complexe dingen. Pak methoden uit voor hergebruik waar u maar kunt. Alleen omdat we code in Rake-bestanden schrijven, zou dit ons niet moeten beletten goede inkapseling en OOP te gebruiken.

  • Taken zoeken

schelp

rake -T secret_service_agent

Dit zal bijvoorbeeld zoeken naar rake taken met "secret_service_agent" erin. Het komt overeen met de naam van de taak, maar niet met de beschrijving.

rake -W create_mi6_agent

Dit laat ons zien waar de taak ligt create_mi6_agent is gedefinieerd.

Laatste gedachten

Rake is een krachtige taakbeheer- en uitvoeringsengine. Open-source software op zijn best, als je het mij vraagt. In het begin was ik echt verrast om te horen hoeveel downloads het de afgelopen jaren heeft vergaard. Dat deze kleine bouwtool de populairste Gem tot nu toe is en meer dan 100 miljoen downloads lijkt gek. 

Maar als je dieper kijkt naar wat het te bieden heeft, wordt het in een flits duidelijk wat een echte softwarebran schrijver Jim Weirich echt was: een echte Ruby-held die we allemaal moeten bewonderen vanwege zijn werk, nalatenschap en passie. Ik laat je achter met een leuk video-interview waarin Jim Rake bespreekt. Er zijn tal van andere video's van zijn lezingen online beschikbaar. Bekijk ze allemaal!