Rake 301

Cet article final examine FileList, Pathmap, CLEAN, CLOBBER et les arguments de passage. Celles-ci ne sont pas super importantes pour les débutants tout de suite, mais elles seront certainement très utiles plus tard - elles sont vraiment précieuses.

Les sujets

  • Passer des arguments
  • Liste de fichiers
  • Pathmap
  • Clean & Clobber
  • Pour la route

Passer des arguments

Vous avez deux options pour passer des arguments dans les tâches Rake. Vous pouvez le faire en utilisant des variables Bash ou en utilisant la syntaxe de Rake.

ENV variable

Si vous n'avez pas joué avec Bash auparavant ou si Bash vous ressemble, prenons-en cinq et recommençons depuis le début.. 

Bash dans votre shell offre deux sortes de variables: les variables globales (environnement) et les variables locales. Les deux sont écrits en majuscules. Les variables d'environnement sont globales, ce qui signifie qu'elles sont disponibles dans tous les shells et ne disparaissent pas lorsque vous en fermez une, contrairement aux variables locales de Bash, qui ne sont disponibles que dans le shell actuel.. 

Les variables d'environnement peuvent contenir des données pouvant être utilisées par plusieurs applications et sont souvent utilisées comme un moyen pratique de partager des paramètres de configuration. Contrairement à cela, les variables Bash locales ne sont que cela, locales. 

Dans notre contexte d'utilisation de Rake, vous avez la possibilité d'accéder à la fois à Ruby et, en fait, à passer des variables depuis la ligne de commande..

FYI

Juste un peu de côté, si vous tapez env ou ENV dans votre shell, vous aurez accès à de nombreuses variables d'environnement. J'ai rédigé la liste, mais pour mieux comprendre ce que sont les variables d'environnement et ce qu'elles incluent, je vous encourage à le gérer vous-même..

coquille

env

Sortie

TERM_PROGRAM = Apple_Terminal TERM = screen-256color SHELL = / bin / bash TMUX = / private / var / dossiers / 4z / 3np9k5ks62b1xpbn_w_lmrgh0000gr / T / tmux-504 / défaut, 4146,0 EDITOR = vim LANG = en_US. % 1 is_vim = echo "# pane_current_command" | grep -iqE "(^ | \ /) g? (voir | n? vim? x?) (diff)? $"… 

Si vous voulez voir une liste de variables Bash locales, vous pouvez exécuter ensemble.

coquille

(set -o posix; set) | Moins

le ensemble commande vous donne beaucoup plus de sortie, mais ce qui précède vous montre tout de suite les bits pertinents.

Méthode de classe ENV de Ruby

Ruby offre un moyen d'utiliser les variables d'environnement et les variables Bash locales de la même manière via un accesseur semblable à un hachage. Pour nos besoins, lorsque nous passons une variable à une tâche Rake, il s’agit d’une variable Bash locale, que vous pouvez trouver dans la liste des variables en cours d’exécution. ensemble ou une variante de celui-ci. Ruby peut le lire en utilisant ENV ['VARIABLE'].

coquille

rake prepare_book BOOKTITLE = "Confessions d'une licorne"

Ce que je veux préciser, cependant, c'est que cette variable ne sera pas ajoutée à la liste ENV que votre système utilise - tout ce que vous avez vu appeler env de la coquille. Pour l'ajouter à cette liste, vous devez le "exporter". Ceci est une autre histoire, mais je pensais que je devrais le dire clairement.

Certains rakefile

tâche: prepare_book do book_title = ENV ['BOOKTITLE'] || "Titre de travail" met "faire quelque chose avec le # book_title" fin

Dans cette définition de tâche, vous pouvez voir comment nous nous sommes préparés à accepter ou à incorporer la variable transmise à l'appel de tâche. Ruby ENV [BASHVARIABLE] fait tout le gros du travail. Si TITRE DE LIVRE avait été une variable d'environnement globale, cependant, nous aurions pu y accéder aussi bien avec cette syntaxe qu'avec cette syntaxe.

Syntaxe des paramètres de rake

La seconde approche utilise la syntaxe pure de Rake. Vous passez simplement les variables dans des accolades. Cette approche est meilleure et vous pouvez garder les choses plus isolées. Pourquoi impliquer Bash si Rake est parfaitement capable de gérer cela? De plus, aucune variable Bash ne flotte de cette façon. Si vous souhaitez passer plusieurs arguments dans une tâche, elle est également beaucoup plus élégante..

coquille

rake "create_mi6_agent [James, Bond, 007]"

Certains rakefile

tâche: create_mi6_agent, [: prénom,: nom,, numéro] do | t, args | met "Le numéro # args.number est commander # args.first_name # args.last_name." fin

Lorsque vous transmettez plus d'arguments que ce que vous avez défini dans votre tâche, vous pouvez simplement y accéder via args. args.extras affiche un tableau de tous les paramètres ajoutés. args.to_a vous montre tous les paramètres d'un tableau aussi, bien sûr.

Liste de fichiers

Dans les exemples précédents, nous avons collecté manuellement des listes de fichiers nécessitant une transformation. C'est fastidieux, non? Liste de fichiers est l'une de ces subtilités qui fait de Rake un outil puissant. Il est tout simplement trop facile de définir un motif global pour les fichiers dont vous avez besoin et de le mettre automatiquement à jour lorsque vous ajoutez ou supprimez des fichiers de cette destination. Avec cela à notre disposition, les listes de filtrage peuvent être aussi simples ou aussi sophistiquées que nous avons besoin. Les expressions régulières ne sont que la pointe de l'iceberg - bien que très pratique, bien sûr.

Le besoin de listes de fichiers à traiter est très courant pour les outils de construction, et faciliter la gestion de ces fichiers est l’un des points forts de Rake. FileList rend votre fichier Rakefile plus petit, plus intelligent et capable de gérer un nombre arbitraire de fichiers que vous n'avez pas besoin de gérer. Vous pouvez laisser Rake en charge. 

Alors, quelle est exactement une FileList? Considérez-le comme un tableau de fichiers correspondant au modèle donné. C'est un Ruby Array spécialisé qui se concentre sur le traitement des listes de fichiers en les stockant sous forme de chaînes. Une fois collectées, elles sont prêtes à être répétées et à appliquer des transformations..

Certains rakefile

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

La gestion manuelle de ces fichiers est un moyen sûr de construire sur le sable. Et, bien sûr, Rake vérifie les horodatages de cette liste et reconstruit uniquement les fichiers obsolètes. Un FileList est aussi paresseux. Il ne récupère pas les fichiers tant qu'ils ne sont pas nécessaires. Si vous avez un tas de listes de fichiers, ils se comportent très sainement et intelligemment à cause de cela. Les listes qui ne sont pas utilisées activement le prennent facilement sans toucher au système de fichiers. C'est plus efficace comme ça.

Comme vous pouvez le voir ci-dessous, vous pouvez également fournir plusieurs modèles globaux pour la liste..

Certains rakefile

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

Avec les grands ensembles de fichiers, les exclusions sont très pratiques - par exemple, si vous souhaitez filtrer les fichiers temporaires, les fichiers de sauvegarde des éditeurs, les fichiers Git ou certains répertoires inutiles. En bref, les règles d'exclusion s'appliquent aux fichiers que vous ne voulez pas dans votre construction..

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

Nous pouvons passer les fichiers de la liste de fichiers à travers son initialiseur, qui accepte une liste de masques de fichiers. Vous traitez toutes les exclusions dans le bloc. Nous avons simplifié la liste des extensions de fichiers souhaitées via markdown, md garder les choses au sec. En outre, vous pouvez chaîner ces exclusions autant que nécessaire. Ici, nous pourrions même vérifier si les fichiers inclus dans la liste sont vides (zéro?) et les exclure du tableau de cette façon.

articles = Rake :: FileList.new ('_ posts / ** / *. md') do | fichiers | files.exclude ('/ _ posts / drafts / *. markdown, md') files.exclude ('_ posts / ~ *') files.exclude do | fichier | File.zero?(file) end end

Nous fournissons essentiellement plusieurs modèles globaux pour la collecte des fichiers dont nous avons besoin dans la liste de fichiers. Pour une raison quelconque, vous pouvez également aller dans le sens opposé et inclure des fichiers dans une liste de fichiers..

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

Pathmap

C'est l'arme secrète de Rake et elle montre son véritable pouvoir en vous permettant de manipuler les chemins de fichiers. Il peut être appelé sur une liste de fichiers via FileList ou sur des fichiers individuels. N'oubliez pas que cela fonctionne sur les chaînes, cependant. Cela fait partie d'une extension de Ruby Chaîne classe.

Jouons avec un fichier simple et changeons une extension simple. Nous pourrions le faire avec le pratique ext méthode, bien sûr.

Quelques rubis

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

le ext Cette méthode nous permet de remplacer une extension de fichier assez facilement. Voyons ce que nous pouvons faire avec ce fichier lorsque nous jouons avec carte de cheminement, bien que. Je pense que c'est la meilleure façon de vous montrer ce qu'il vous réserve. Nous pouvons réaliser la même chose comme ça.

Certains rakefile

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

Comme vous pouvez le constater, ceci est un peu plus élégant. Nous fournissons carte de cheminement avec une spécification de ce dont nous avons besoin de cette chaîne via %.

  • %X

En utilisant cela, nous obtenons tout sauf l'extension du fichier. Ensuite, nous ajoutons simplement l'extension dont nous avons besoin. C'est juste gratter la surface, bien que. carte de cheminement a beaucoup de marqueurs utiles qui vous permettent d'être plus créatif. Les manipulations de chemin de fichier ne pourraient pas être plus faciles avec ceci. 

  • % p

Si vous avez besoin du chemin complet.

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

Si vous avez juste besoin du nom d'un chemin donné. Pas de répertoires mais avec l'extension de fichier.

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

Si vous avez besoin du nom de fichier d'un chemin donné sans son extension.

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

Si vous n'avez besoin que de la liste des répertoires d'un chemin donné.

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

Extrait uniquement l'extension de fichier.

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

Vous montre uniquement le séparateur de fichiers.

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

Si vous souhaitez spécifier un nombre spécifique de répertoires dont vous avez besoin. Pratique pour les structures de fichiers profondément imbriquées.

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

Vous pouvez également l'approcher dans l'ordre inverse en utilisant un moins.

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

Comme vous pouvez le constater, cette petite méthode répond à tous les besoins que vous pouvez avoir en mappant une liste de fichiers sur une autre liste de fichiers. Attachez-le à une liste de fichiers et la magie s'installera. C'est vraiment un outil puissant pour modifier les noms de fichiers..

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

Ici, par exemple, nous prenons une liste d’images et les mappons vers de nouveaux noms de fichiers en extrayant les noms de fichiers et en ajoutant un fichier. -les pouces suffixe plus l'extension de fichier extraite en les mettant dans un les pouces annuaire. Je suis sûr que vous trouverez un très bon usage pour carte de cheminement.

Clean & Clobber

Nous voulons pouvoir remettre un projet dans un état vierge. En outre, une liste de fichiers est non seulement pratique pour préparer les fichiers à transformer, mais facilite également la collecte des fichiers que vous souhaitez nettoyer après avoir terminé vos tâches. CLEAN et CLOBBER sont également des FileLists - ils ont juste deux tâches très spécifiques à gérer-Suppression.

Certains rakefile

nécessite 'rake / clean' CLEAN.include ('*. intermediary_files') CLOBBER.include ('*. intermediate_files', 'built_files / *')

Bien entendu, ces deux tâches sont idiotes et vous devez leur alimenter des listes de fichiers via notre outil pratique. comprendre. Quand tu cours râteau propre ou rake clobber, ces fichiers collectés vont disparaître. Comme il s'agit d'un module optionnel, vous devez d'abord en avoir besoin dans votre fichier Rakefile. Les avantages de CLEAN et CLOBBER sont qu’ils vous offrent un emplacement central pour le nettoyage de vos fichiers de construction. Bien sûr, vous pouvez écrire manuellement les tâches de rake pour vous en occuper, mais CLEAN et CLOBBER le résolvent pour vous sans réinventer la roue..

Nous ne mettons pas tout dans une tâche propre, car il est pratique de différencier les fichiers intermédiaires des fichiers de construction. Supposons que nous devions créer des fichiers HTML pour créer les versions PDF finales de nos fichiers Markdown. Nous voudrions inclure les fichiers HTML dans notre NETTOYER liste. Les deux .html et la finale .pdf les fichiers iraient dans TABASSER. Conceptuellement, la liste CLOBBER est supposée supprimer tout ce qui se trouve dans les deux listes.

Pourquoi nous intéressons-nous à ces fichiers de construction? Parfois, vous souhaitez tout reconstruire et effacer les anciens fichiers pour obtenir une nouvelle version. Par conséquent, vous avez besoin d'un moyen de supprimer tous les fichiers générés tout en conservant les fichiers source nécessaires pour les fichiers les plus souvent créés sous contrôle de version. Il est facile pour ces listes de devenir obsolètes lorsque vous résolvez ce problème manuellement. Par conséquent, les manipuler comme notre bon vieil ami FileList rend ce processus beaucoup plus efficace..

Pour la route

  • Composants 

Rake, à son essence, sert bien sûr à la gestion des tâches. Décomposez-les en leurs composants les plus utiles et construisez-les afin de créer des tâches plus importantes. Pensez OOP! La même chose vaut pour vos fichiers. Rails rend cela très facile pour vous via tâches / lib. Dans d’autres projets, vous pouvez créer un répertoire appelé rakélib et construisez vos composants Rake ici. Rake charge le fichier Rakefile et rakelib / *. rake fichiers automatiquement.

  • En utilisant rake - séché

Si vous avez besoin d'exécuter une tâche potentiellement destructive dans un sens et que vous souhaitez plutôt vérifier d'abord le rôle de cette tâche, vous pouvez trier la tâche dans un bac à sable. Vous verrez le journal de ce qu'il fait sans les opérations de fichiers.

  • BAISER

Rester simple! Rake est intelligent pour faire le minimum possible. Alors devriez-vous être. La bonne chose à propos de Rake est qu’il fournit une excellente connexion DSL sans vous donner beaucoup de corde pour vous faire du mal en réinventant la roue inutilement..

  • Espaces de noms

Les espaces de noms ne coûtent pas cher et vous empêchent de rencontrer des noms de tâches conflictuels. Ceci est particulièrement important si vous avez des Rakefiles provenant de différentes sources et de plusieurs développeurs..

task: fight_bad_dude do… end espace de noms: bond do task: fight_bad_dude… end end
  • Manipulations de fichiers

Utilisez FileUtils et éloignez-vous des manipulations de fichiers shell dans vos tâches. C'est un peu sale quand Rake les met déjà directement à votre disposition.

  • Commandes Ruby

Vous pouvez exécuter des fichiers Ruby dans des fichiers Rake. Cela pourrait être utile de temps en temps.

tâche: tâche_complète ruby ​​'ruby_program.rb' end
  • Tâches générées dynamiquement

Utilisez des règles si vous avez beaucoup de fichiers au lieu de tâches générées dynamiquement. Pourquoi? Courir rake -P et vous obtiendrez tous une liste. Cela peut devenir incontrôlable très, très rapidement. De plus, ne pas utiliser les règles manque souvent tout simplement d'élégance. Vous n'avez peut-être pas encore réduit le motif à son noyau. Plus important encore, cela facilitera la réutilisation tout en étant sec, bien sûr.

  • Des listes

Au lieu de définir vous-même les collections pour les fichiers et de mettre à jour cette liste, nous préférons laisser Rake s'en charger. Comme nous l’avons vu, la collecte de fichiers pour vos tâches n’est pas du tout compliquée dans Rake.. 

  • Rubis

Utilisez les méthodes Ruby pour des tâches plus complexes. Extrayez les méthodes pour les réutiliser chaque fois que vous le pouvez. Le fait que nous écrivions du code dans des fichiers Rake ne devrait pas nous empêcher d’être correctement encapsulé et ouvert.

  • Tâches de recherche

coquille

rake -T secret_service_agent

Ceci, par exemple, recherchera les tâches rake avec «secret_service_agent» dans celles-ci. Cela correspond au nom de la tâche mais pas à la description.

rake -W create_mi6_agent

Cela nous montre où la tâche create_mi6_agent est défini.

Dernières pensées

Rake est un puissant moteur de gestion et d'exécution des tâches. Les logiciels libres à leur meilleur, si vous me le demandez. Au début, j'ai été vraiment surpris d'apprendre le nombre de téléchargements accumulés au cours des deux dernières années. Que ce petit outil de compilation soit la gemme la plus populaire à ce jour et compte plus de 100 millions de téléchargements semble dingue. 

Mais si vous regardez plus en profondeur ce qu’il a à offrir, vous comprendrez parfaitement ce qu’était en réalité un véritable éditeur de logiciels, Jim Weirich: un véritable héros Ruby que nous devrions tous admirer pour son travail, son héritage et sa passion. Je vous laisse avec une belle interview vidéo où Jim discute de Rake. Il y a des tonnes d'autres vidéos de ses entretiens disponibles en ligne. Allez les regarder tous!