Este último artículo analiza FileList, Pathmap, CLEAN, CLOBBER y los argumentos de paso. Estos no son muy importantes para los principiantes de inmediato, pero sin duda serán muy útiles en un momento posterior de un valor incalculable..
Tienes dos opciones para pasar argumentos a tareas de Rake. Puede hacerlo usando variables Bash o haciendo uso de la propia sintaxis de Rake.
En caso de que no hayas jugado con Bash antes, o si Bash te suena como un engaño para ti, tomemos cinco y comenzamos desde el principio..
Bash en su shell ofrece dos tipos de variables: variables globales (entorno aka) y variables locales. Ambos están escritos en mayúsculas. Las variables de entorno son globales, lo que significa que están disponibles en todos los shells y no desaparecen cuando se cierran las variables de Bash locales, que solo están disponibles en el shell actual.
Las variables de entorno pueden contener datos que pueden ser utilizados por múltiples aplicaciones y, a menudo, se utilizan como una forma práctica de compartir las configuraciones. En contraste con eso, las variables locales de Bash son solo eso, local.
En nuestro contexto de uso de Rake, tiene la capacidad de acceder tanto a través de Ruby como a las variables de paso de efecto desde la línea de comando.
Un poco aparte, si escribes env
o ENV
en su shell, obtendrá acceso a un montón de variables de entorno. Redacté la lista, pero para una mejor comprensión de qué son las variables de entorno y qué incluyen, te animo a que lo ejecutes por ti mismo..
env
TERM_PROGRAM = Apple_Terminal TERM = screen-256color SHELL = / bin / bash TMUX = / private / var / carpetas / 4z / 3np9k5ks62b1xpbn_w_lmrgh0000gr / T / tmux-504 / default, 4146,0 EDITOR = vim. % 1 is_vim = echo "# pane_current_command" | grep -iqE "(^ | \ /) g? (view | n? vim? x?) (diff)? $"…
Si desea ver una lista de variables de Bash locales, puede ejecutar conjunto
.
(set -o posix; set) | Menos
los conjunto
El comando te da mucha más salida, pero lo anterior te muestra los bits relevantes de inmediato.
Ruby ofrece una forma de utilizar variables de entorno y Bash locales por igual a través de un elemento de acceso tipo hash. Para nuestras necesidades, cuando pasamos una variable a una tarea de Rake, será una variable de Bash local, que puede encontrar en la lista de variables que se ejecutan. conjunto
o una variación de ella. Ruby puede leerlo usando ENV ['VARIABLE']
.
rake prepare_book BOOKTITLE = "Confesiones de un unicornio"
Sin embargo, lo que quiero aclarar es que esta variable no se agregará a la lista de ENV que usa su sistema, las cosas que vio llamando env
de la cáscara. Para agregarlo a esa lista, debe "exportarlo". Esta es otra historia, pero pensé que debería aclarar esto..
tarea: prepare_book do book_title = ENV ['BOOKTITLE'] || 'Título de trabajo' pone el final "Hacer algo con el # book_title"
En esta definición de tarea, puede ver cómo nos preparamos para aceptar o incorporar la variable pasada a la invocación de la tarea. Ruby ENV [BASHVARIABLE]
hace todo el trabajo pesado. Si TITULO DEL LIBRO
Sin embargo, si hubiera sido una variable de entorno global, podríamos haberla accedido dentro de esta definición de tarea con esta sintaxis.
El segundo enfoque es usar la sintaxis de Rake puro. Simplemente pasa las variables a llaves cuadradas. Ese enfoque es mejor y puedes mantener las cosas más aisladas. ¿Por qué involucrar a Bash si Rake es perfectamente capaz de manejar esto? Además, no tienes ninguna variable Bash flotando alrededor de esa manera. Si quieres pasar varios argumentos a una tarea, también es mucho más elegante..
Rake "create_mi6_agent [James, Bond, 007]"
tarea: create_mi6_agent, [: first_name,: last_name,: number] do | t, args | pone "Number # args.number es el comandante # args.first_name # args.last_name". fin
Cuando pasa más argumentos de los que ha definido en su tarea, simplemente puede acceder a ellos a través de args
. args.extras
muestra una matriz de todos los parámetros adicionales pasados. args.to_a
te muestra todos los parámetros, también en una matriz, por supuesto.
En ejemplos anteriores, hemos estado recolectando manualmente listas de archivos que necesitan alguna transformación. Eso es tedioso, ¿verdad?? FileList
Es una de esas sutilezas que hace de Rake una herramienta poderosa. Es demasiado fácil definir un patrón global para los archivos que necesita y tenerlo automáticamente actualizado cuando agregue o elimine archivos de ese destino. Con eso a nuestra disposición, las listas de filtrado pueden ser tan sencillas o sofisticadas como sea necesario. Las expresiones regulares son solo la punta del iceberg, aunque son muy útiles, por supuesto..
La necesidad de listas de archivos para procesar es muy común para las herramientas de compilación, y hacer que sea fácil tratar con ellos es uno de los puntos fuertes de Rake. FileList hace que su Rakefile sea más pequeño, más inteligente y capaz de manejar un número arbitrario de archivos que no necesita administrar. Puedes dejar a Rake a cargo..
Entonces, ¿qué es exactamente una lista de archivos? Piense en ello como una matriz de archivos que coinciden con el patrón dado. Es un Ruby Array especializado que se enfoca en procesar listas de archivos, almacenándolos como cadenas. Una vez recolectados, están listos para que repitas y apliques transformaciones..
image_list = FileList ['images / *. png'] => ["images / jim-weirich.png", "images / zen-rake.png"]
La gestión de estos archivos a mano es una forma segura de construir sobre arena. Y, por supuesto, Rake verifica las marcas de tiempo de esta lista y reconstruye solo los archivos que están desactualizados. Una lista de archivos es perezosa también. No toma archivos hasta que son necesarios. Si tienes un montón de listas de archivos, se comportan muy sanos e inteligentes debido a eso. Las listas que no se utilizan activamente lo están tomando con calma sin golpear el sistema de archivos. Es más eficiente así..
Como puede ver a continuación, también puede proporcionar múltiples patrones globales para la lista.
image_list = FileList ['images / *. png', 'images / *. jpg'] => ["images / happy-jim.jpg", "images / jim-weirich.png", "images / zen-rake. png "]
Con grandes conjuntos de archivos, las exclusiones son muy útiles, por ejemplo, si queremos filtrar archivos temporales, archivos de copia de seguridad de editores, archivos Git o ciertos directorios que no son necesarios. En resumen, las reglas de exclusión son para los archivos que no deseas en tu compilación.
articles = Rake :: FileList.new ('_ posts / ** / *. markdown, md') do | files | files.exclude ('/ _ posts / drafts / *. markdown, md') end => ["_posts / publish / 2016 / 2016-02-02-some-article.md", "_posts / publish / 2015 / 2015-12-12-another-article.markdown "]
Podemos pasar los archivos de la Lista de archivos a través de su inicializador, que acepta una lista de máscaras de archivos. Usted procesa cualquier exclusión dentro del bloque. Simplificamos la lista de extensiones de archivo deseadas a través de markdown, md
para mantener las cosas secas. Además, puede encadenar estas exclusiones tanto como sea necesario. Aquí incluso podríamos comprobar convenientemente si los archivos incluidos en la Lista de archivos están vacíos (cero?
) y excluir estos de la matriz de esa manera.
articles = Rake :: FileList.new ('_ posts / ** / *. md') do | files | files.exclude ('/ _ posts / borradores / *. markdown, md') files.exclude ('_ posts / ~ *') files.exclude do | file | File.zero?(file) end end
Básicamente, estamos proporcionando múltiples patrones globales para recopilar solo los archivos que necesitamos en la Lista de archivos. Por cualquier motivo, también puede ir en sentido contrario e incluir archivos en una Lista de archivos.
FL = FileList ['images / *. Png'] FL.include ('images / private / *. Jpg)
Es el arma secreta de Rake y muestra su verdadero poder al permitirte manipular rutas de archivos. Puede invocarse en una lista de archivos a través de la Lista de archivos o también en archivos individuales. Sin embargo, no olvides que funciona en cuerdas. Es parte de una extensión de Ruby. Cuerda
clase.
Juguemos con un archivo simple y cambiemos una extensión simple. Podríamos hacer esto con el práctico ext
método, por supuesto.
"/mi6/q/secret_gadgets.xml".ext("html") # => '/mi6/q/secret_gadgets.html'
los ext
método nos permite reemplazar una extensión de archivo con bastante facilidad. Veamos qué podemos hacer con este archivo cuando jugamos con mapa de ruta
, aunque. Creo que esa es la mejor manera de mostrarte lo que tiene para ti. Podemos lograr lo mismo así..
"/mi6/q/secret_gadgets.xml".pathmap('%X.html ') # =>' /mi6/q/secret_gadgets.html '
Como puedes ver, esto es un poco más elegante. Proporcionamos mapa de ruta
con una especificación de lo que necesitamos de esa cadena a través %
.
%X
Usando esto, obtenemos todo menos la extensión de archivo. Luego simplemente agregamos la extensión que necesitamos. Esto es solo arañar la superficie, aunque. mapa de ruta
Tiene muchos marcadores útiles que te permiten ser más creativo. Manipulación de ruta de archivo no podría ser más fácil con esto.
%pag
Si necesitas el camino completo..
"/mi6/q/secret_gadgets.xml".pathmap('%p ') # =>" mi6 / q / secret_gadgets.xml "
%F
Si solo necesitas el nombre de un camino determinado. Sin directorios pero con la extensión de archivo..
"/mi6/q/secret_gadgets.xml".pathmap('%f ') # =>" secret_gadgets.xml "
%norte
Si necesita el nombre de archivo de una ruta determinada sin su extensión de archivo.
"/mi6/q/secret_gadgets.xml".pathmap('%n ') # =>" secret_gadgets "
%re
Si necesita solo la lista de directorios de una ruta determinada.
"/mi6/q/secret_gadgets.xml".pathmap('%d ') # =>" mi6 / q "
%X
Sólo extrae la extensión de archivo.
"/mi6/q/secret_gadgets.xml".pathmap('%x ') # =>" .xml "
% s
Te muestra solo el separador de archivos.
"/mi6/q/secret_gadgets.xml".pathmap('%s ') # =>" / "
%Dakota del Norte
Si desea especificar un número específico de directorios que necesita. Práctico para estructuras de archivos profundamente anidadas.
"/mi6/q/secret_gadgets.xml".pathmap('%1d ') # =>" mi6 "
"/mi6/q/secret_gadgets.xml".pathmap('%2d ') # =>" mi6 / q "
También puede acercarse a él en el orden inverso utilizando un signo menos..
"/mi6/q/secret_gadgets.xml".pathmap('%-2d ') # =>" mi6 / q "
"/mi6/q/secret_gadgets.xml".pathmap('%-1d ') # =>" q "
Como puede ver, este pequeño método aborda todas las diversas necesidades que puede tener al asignar una lista de archivos a una lista de archivos diferente. Adjúntelo a una Lista de archivos y la magia se activa. Realmente es una herramienta poderosa para mezclar nombres de archivos.
images = FileList ['images / *. png'] thumbs = images.pathmap ('thumbs /% n-thumbs% x')
Aquí, por ejemplo, estamos tomando una lista de imágenes y asignándolas a nuevos nombres de archivos extrayendo los nombres de archivos y agregando un -pulgares
sufijo más la extensión de archivo extraída mientras se ponen en un pulgares
directorio. Estoy seguro de que encontrará muy buen uso para mapa de ruta
.
Queremos poder devolver un proyecto a un estado prístino. En este sentido, una Lista de archivos no solo es útil para preparar los archivos que se van a transformar, sino que también facilita la recopilación de los archivos que desea limpiar después de que haya terminado con sus tareas. CLEAN y CLOBBER son en realidad listas de archivos también, solo tienen dos trabajos muy específicos para manejar-Eliminar.
requiere 'rake / clean' CLEAN.include ('*. middle_files') CLOBBER.include ('*. intermediate_files', 'built_files / *')
Estas dos tareas son tontas, por supuesto, y usted necesita alimentarlas con listas de archivos a través de nuestro práctico incluir
. Cuando corres rastrillo limpio
o rastrillo
, Estos archivos recopilados desaparecerán. Como este es un módulo opcional, primero debe solicitarlo en su Rakefile. Lo bueno de CLEAN y CLOBBER es que te dan un lugar central para manejar la limpieza de tus archivos de compilación. Claro, usted podría escribir las tareas de Rake manualmente para manejar esto, pero CLEAN y CLOBBER lo resuelven por usted sin reinventar la rueda.
No estamos poniendo todo en una tarea limpia porque es útil que pueda diferenciar entre archivos intermedios y de compilación. Digamos que necesitábamos crear archivos HTML para crear versiones finales en PDF de nuestros archivos Markdown. Incluiríamos los archivos HTML en nuestro LIMPIAR
lista. Ambos .html
y la final .pdf
los archivos entrarían GOLPEAR
. Conceptualmente, se supone que la lista CLOBBER elimina todo en ambas listas.
¿Por qué nos importan estos archivos de compilación? A veces desea reconstruir todo y borrar archivos antiguos para obtener una nueva compilación. Por lo tanto, necesita una forma de eliminar todos los archivos que se generaron mientras se mantienen los archivos de origen que son necesarios para la mayoría de los archivos de compilación que están bajo el control de versiones. Es fácil que estas listas queden desactualizadas cuando resuelves esto manualmente. Por lo tanto, manejarlos como nuestro buen amigo FileList hace que este proceso sea mucho más efectivo..
Rake, en su esencia, es para la gestión de tareas, por supuesto. Divídalos en sus componentes más útiles y acumúlelos para crear tareas más grandes. ¡Piensa OOP! Lo mismo ocurre con sus archivos. Rails hace esto muy fácil para ti a través de tareas / lib
. En otros proyectos, puede crear un directorio llamado rakelib
y construir sus componentes Rake allí. Rastrillo carga el Rakefile y rakelib / *. rastrillo
archivos automáticamente.
rastrillo
Si necesita ejecutar una tarea que es potencialmente destructiva en algún sentido y desea verificar primero qué haría esta tarea, puede hacer una especie de caja de arena. Verá el registro de lo que está haciendo sin las operaciones de archivo.
¡Mantenlo simple! Rake es inteligente en hacer la cantidad mínima posible. Así que deberías estarlo. Lo bueno de Rake es que proporciona un gran DSL sin darte mucha cuerda para que te lastimes reinventando innecesariamente la rueda.
Los espacios de nombres son baratos y evitan que se tope con nombres de tareas en conflicto. Esto es especialmente importante si tiene archivos Rake que provienen de diferentes fuentes y de múltiples desarrolladores..
task: fight_bad_dude do… end namespace: bond do task: fight_bad_dude… end end end
Utilice FileUtils y manténgase alejado de las manipulaciones de los archivos de shell en sus tareas. Está un poco sucio cuando Rake ya los pone directamente a tu disposición..
Puedes ejecutar archivos Ruby dentro de archivos Rake. Eso podría ser útil de vez en cuando.
tarea: some_task do ruby 'ruby_program.rb' end
Use reglas si tiene muchos archivos en lugar de tareas generadas dinámicamente. ¿Por qué? correr rastrillo -P
y obtendrás una lista de todos ellos. Eso puede salirse de las manos muy, muy rápidamente. Además de eso, no usar reglas a menudo simplemente carece de elegancia. Es posible que todavía no hayas reducido el patrón a su núcleo. Lo más importante es que esto hará que la reutilización sea más fácil mientras se SECA, por supuesto..
En lugar de definir colecciones para los archivos usted mismo, y también actualizar esta lista, preferimos dejar que Rake se encargue de eso. Como hemos visto, la recopilación de archivos para sus tareas no es nada complicada en Rake.
Hacer uso de los métodos de Ruby para cosas más complejas. Extrae métodos para reutilizarlos siempre que puedas. El hecho de que estemos escribiendo código en archivos Rake, no debería impedirnos encapsularlo y ejecutarlo correctamente..
rake -T secret_service_agent
Esto, por ejemplo, buscará tareas de rake con "secret_service_agent" en ellas. Coincide con el nombre de la tarea, pero no con la descripción.
rastrillo -W create_mi6_agent
Esto nos muestra dónde está la tarea. create_mi6_agent
se define.
Rake es un potente motor de ejecución y gestión de tareas. Lo mejor del software de código abierto, si me preguntas. Al principio, me sorprendió mucho saber cuántas descargas se han acumulado en los últimos años. Que esta pequeña herramienta de compilación es la gema más popular hasta la fecha y tiene más de 100 millones de descargas parece una locura.
Pero cuando te fijas más en lo que tiene para ofrecer, se vuelve muy claro en un instante lo que realmente era un maestro escritor de software Jim Weirich: un verdadero héroe Ruby al que todos debemos admirar por su trabajo, legado y pasión. Te dejo con una agradable entrevista en video donde Jim habla sobre Rake. Hay toneladas de otros videos de sus charlas disponibles en línea. Ve a verlos a todos!