Introduccion basica a Rake
Spanish (Español) translation by Elías Nicolás (you can also view the original English article)
Este artículo explica los fundamentos de Rake. Es una herramienta de compilación muy popular que está escrita en Ruby. Ofrece mucha flexibilidad y se utiliza para gestionar todo tipo de tareas. Si
está utilizando Rails, le recomiendo que eche un vistazo bajo el capó
para averiguar qué tareas están a su disposición y cómo escribir las
suyas.
Temas
- ¿Qué es Rake?
- Lista de tareas
- Primeros pasos
- Espacios de nombres
- Requisitos previos
- Pasando Argumentos
- Tareas de interés
¿Qué es Rake?
Gracias a Rails, Rake se ha convertido en un estándar de facto como una herramienta de construcción Ruby. Es muy popular en la comunidad Ruby. El equipo detrás de Rails decidió usar Rake como el constructor de Rails, lo que significaba que en el pasado, cuando descargabas Rails, también necesitabas una copia de Rake. De esa manera expuso a Rake a muchas personas. Un poco más tarde, fue incluido en Ruby (1.9).
Rake de facto reemplazó la utilidad Make de Unix como una herramienta de compilación en Ruby. Una herramienta de compilación como Rake es útil para automatizar tareas de varios tipos—un software para gestionar tareas básicamente. A menudo se utiliza para tareas de administración en Rails—que es donde probablemente se han encontrado con él hasta ahora—pero sus casos de uso son muchos. Algunas personas escriben sus libros electrónicos en Markdown y han establecido tareas Rake que convierten los archivos relevantes en archivos HTML intermedios, que a su vez se convierten en formatos de libros electrónicos, por ejemplo. Se ahorra en un montón de problemas el usar Rake para eso.
Lo que hace que Rake sea realmente poderoso es que estas tareas pueden relacionarse entre sí y pueden ser construidas una encima de otra. Además, ya que está escrito en Ruby, puede escribir cualquier código Ruby para sus tareas. ¿Quieres usar las bibliotecas Ruby en tus tareas de Rake? ¡No hay problema! Hecho divertido: es el más descargado de RubyGem, con más de 100 millones de descargas. Así que definitivamente algo en su cinturón de herramientas al que debe prestar un poco más de atención.
Fue concebido por el fallecido Jim Weirich, un conocido y querido desarrollador, orador y colaborador del ecosistema de Ruby. Es una hermosa herramienta realmente—¡gracias, Jim! ¡Q.E.P.D!
Lista de tareas
Echemos un vistazo a algunas tareas que ofrece Rails. Apuesto a que estás un poco sorprendido de lo que está disponible si no has comprobado antes. En el directorio correspondiente de tu aplicación o de tu Rakefile, puedes listarlos escribiendo lo siguiente en un shell:
1 |
rake --tasks |
2 |
|
3 |
#or |
4 |
|
5 |
rake -T |
Salida:
1 |
rake about # List versions of all Rails frameworks and the environment |
2 |
rake assets:clean[keep] # Remove old compiled assets |
3 |
rake assets:clobber # Remove compiled assets |
4 |
rake assets:environment # Load asset compile environment |
5 |
rake assets:precompile # Compile all the assets named in config.assets.precompile |
6 |
rake cache_digests:dependencies # Lookup first-level dependencies for TEMPLATE (like messages/show or comm... |
7 |
rake cache_digests:nested_dependencies # Lookup nested dependencies for TEMPLATE (like messages/show or comments/... |
8 |
rake db:create # Creates the database from DATABASE_URL or config/database.yml for the cu... |
9 |
rake db:drop # Drops the database from DATABASE_URL or config/database.yml for the curr... |
10 |
rake db:fixtures:load # Load fixtures into the current environment's database |
11 |
rake db:migrate # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog) |
12 |
rake db:migrate:status # Display status of migrations |
13 |
rake db:rollback # Rolls the schema back to the previous version (specify steps w/ STEP=n) |
14 |
rake db:schema:cache:clear # Clear a db/schema_cache.dump file |
15 |
rake db:schema:cache:dump # Create a db/schema_cache.dump file |
16 |
rake db:schema:dump # Create a db/schema.rb file that is portable against any DB supported by AR |
17 |
rake db:schema:load # Load a schema.rb file into the database |
18 |
rake db:seed # Load the seed data from db/seeds.rb |
19 |
rake db:setup # Create the database, load the schema, and initialize with the seed data ... |
20 |
rake db:structure:dump # Dump the database structure to db/structure.sql |
21 |
rake db:structure:load # Recreate the databases from the structure.sql file |
22 |
rake db:version # Retrieves the current schema version number |
23 |
rake doc:app # Generate docs for the app -- also available doc:rails, doc:guides (optio... |
24 |
rake log:clear # Truncates all *.log files in log/ to zero bytes (specify which logs with... |
25 |
rake middleware # Prints out your Rack middleware stack |
26 |
rake notes # Enumerate all annotations (use notes:optimize, :fixme, :todo for focus) |
27 |
rake notes:custom # Enumerate a custom annotation, specify with ANNOTATION=CUSTOM |
28 |
rake rails:template # Applies the template supplied by LOCATION=(/path/to/template) or URL |
29 |
rake rails:update # Update configs and some other initially generated files (or use just upd... |
30 |
rake routes # Print out all defined routes in match order, with names |
31 |
rake secret # Generate a cryptographically secure secret key (this is typically used t... |
32 |
rake spec # Run all specs in spec directory (excluding plugin specs) |
33 |
rake spec:controllers # Run the code examples in spec/controllers |
34 |
rake spec:features # Run the code examples in spec/features |
35 |
rake spec:helpers # Run the code examples in spec/helpers |
36 |
rake spec:models # Run the code examples in spec/models |
37 |
rake spec:views # Run the code examples in spec/views |
38 |
rake stats # Report code statistics (KLOCs, etc) from the application or engine |
39 |
rake time:zones:all # Displays all time zones, also available: time:zones:us, time:zones:local... |
40 |
rake tmp:clear # Clear session, cache, and socket files from tmp/ (narrow w/ tmp:sessions... |
41 |
rake tmp:create # Creates tmp directories for sessions, cache, sockets, and pids |
La salida en una aplicación de Rails es sorprendentemente abundante, ¿no? Puede
encontrar muchas más tareas útiles que el db habitual rake db:migrate o
rake routes con las que estamos familiarizados y ejecutar varias
veces diariamente.
A la izquierda, verá las distintas tareas y, a la derecha, verá lo que se proporciona opcionalmente como una descripción para cada tarea de rake. Si desea ver la lista completa, que entre otras cosas también incluye tareas que carecen de una descripción, debe agregar un indicador adicional.
Terminal:
1 |
rake -T -A |
2 |
|
3 |
#or |
4 |
|
5 |
rake -T -all |
Salida:
1 |
rake about # List versions of all Rails frameworks and the environment |
2 |
rake assets:clean[keep] # Remove old compiled assets |
3 |
rake assets:clobber # Remove compiled assets |
4 |
rake assets:environment # Load asset compile environment |
5 |
rake assets:precompile # Compile all the assets named in config.assets.precompile |
6 |
rake cache_digests:dependencies # Lookup first-level dependencies for TEMPLATE (like messages/show or comments/_comment.html) |
7 |
rake cache_digests:nested_dependencies # Lookup nested dependencies for TEMPLATE (like messages/show or comments/_comment.html) |
8 |
rake db:_dump # |
9 |
rake db:abort_if_pending_migrations # |
10 |
rake db:charset # |
11 |
rake db:collation # |
12 |
rake db:create # Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config) |
13 |
rake db:create:all # |
14 |
rake db:drop # Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config) |
15 |
rake db:drop:all # |
16 |
rake db:fixtures:identify # |
17 |
rake db:fixtures:load # Load fixtures into the current environment's database |
18 |
rake db:forward # |
19 |
rake db:load_config # |
20 |
rake db:migrate # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog) |
21 |
rake db:migrate:down # |
22 |
rake db:migrate:redo # |
23 |
rake db:migrate:reset # |
24 |
rake db:migrate:status # Display status of migrations |
25 |
rake db:migrate:up # |
26 |
rake db:purge # |
27 |
rake db:purge:all # |
28 |
rake db:reset # |
29 |
rake db:rollback # Rolls the schema back to the previous version (specify steps w/ STEP=n) |
30 |
rake db:schema:cache:clear # Clear a db/schema_cache.dump file |
31 |
rake db:schema:cache:dump # Create a db/schema_cache.dump file |
32 |
rake db:schema:dump # Create a db/schema.rb file that is portable against any DB supported by AR |
33 |
rake db:schema:load # Load a schema.rb file into the database |
34 |
rake db:schema:load_if_ruby # |
35 |
rake db:seed # Load the seed data from db/seeds.rb |
36 |
rake db:setup # Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the database first) |
37 |
rake db:structure:dump # Dump the database structure to db/structure.sql |
38 |
rake db:structure:load # Recreate the databases from the structure.sql file |
39 |
rake db:structure:load_if_sql # |
40 |
rake db:test:clone # |
41 |
rake db:test:clone_schema # |
42 |
rake db:test:clone_structure # |
43 |
rake db:test:deprecated # |
44 |
rake db:test:load # |
45 |
rake db:test:load_schema # |
46 |
rake db:test:load_structure # |
47 |
rake db:test:prepare # |
48 |
rake db:test:purge # |
49 |
rake db:version # Retrieves the current schema version number |
50 |
rake default # |
51 |
rake doc # |
52 |
rake doc/app # |
53 |
rake doc/app/created.rid # |
54 |
rake doc:app # Generate docs for the app -- also available doc:rails, doc:guides (options: TEMPLATE=/rdoc-template.rb, TITLE="Custom Title") |
55 |
rake doc:clobber # |
56 |
rake doc:clobber_app # |
57 |
rake doc:clobber_rails # |
58 |
rake doc:guides # |
59 |
rake doc:rails # |
60 |
rake doc:reapp # |
61 |
rake doc:rerails # |
62 |
rake environment # |
63 |
rake html # |
64 |
rake html/created.rid # |
65 |
rake log:clear # Truncates all *.log files in log/ to zero bytes (specify which logs with LOGS=test,development) |
66 |
rake magic # Magic rake task |
67 |
rake middleware # Prints out your Rack middleware stack |
68 |
rake no_description # |
69 |
rake notes # Enumerate all annotations (use notes:optimize, :fixme, :todo for focus) |
70 |
rake notes:custom # Enumerate a custom annotation, specify with ANNOTATION=CUSTOM |
71 |
rake notes:fixme # |
72 |
rake notes:optimize # |
73 |
rake notes:todo # |
74 |
rake rails:template # Applies the template supplied by LOCATION=(/path/to/template) or URL |
75 |
rake rails:templates:copy # |
76 |
rake rails:update # Update configs and some other initially generated files (or use just update:configs or update:bin) |
77 |
rake rails:update:bin # |
78 |
rake rails:update:configs # |
79 |
rake railties:install:migrations # |
80 |
rake routes # Print out all defined routes in match order, with names |
81 |
rake secret # Generate a cryptographically secure secret key (this is typically used to generate a secret for cookie sessions) |
82 |
rake spec # Run all specs in spec directory (excluding plugin specs) |
83 |
rake spec:controllers # Run the code examples in spec/controllers |
84 |
rake spec:features # Run the code examples in spec/features |
85 |
rake spec:helpers # Run the code examples in spec/helpers |
86 |
rake spec:models # Run the code examples in spec/models |
87 |
rake spec:prepare # |
88 |
rake spec:statsetup # |
89 |
rake spec:views # Run the code examples in spec/views |
90 |
rake stats # Report code statistics (KLOCs, etc) from the application or engine |
91 |
rake time:zones:all # Displays all time zones, also available: time:zones:us, time:zones:local -- filter with OFFSET parameter, e.g., OFFSET=-6 |
92 |
rake time:zones:local # |
93 |
rake time:zones:us # |
94 |
rake tmp # |
95 |
rake tmp/cache # |
96 |
rake tmp/cache/assets # |
97 |
rake tmp/cache/assets/development # |
98 |
rake tmp/cache/assets/production # |
99 |
rake tmp/cache/assets/test # |
100 |
rake tmp/pids # |
101 |
rake tmp/sessions # |
102 |
rake tmp/sockets # |
103 |
rake tmp:cache:clear # |
104 |
rake tmp:clear # Clear session, cache, and socket files from tmp/ (narrow w/ tmp:sessions:clear, tmp:cache:clear, tmp:sockets:clear) |
105 |
rake tmp:create # Creates tmp directories for sessions, cache, sockets, and pids |
106 |
rake tmp:pids:clear # |
107 |
rake tmp:sessions:clear # |
108 |
rake tmp:sockets:clear # |
Sorpresa, ¡casi tres veces más! Echale un vistazo a ellos, pero comprometer los aspectos más destacados a la memoria para su uso posterior en el futuro. Comprobar las tareas para ver lo que está disponible podría impedirle reinventar la rueda.
Primeros pasos
Un Rakefile puede tener una de las siguientes cinco variaciones:
- rakefile.rb
- rakefile
- Rakefile
- Rakefile.rb
- .rake files
En su mayoría verá la versión Rakefile, pero un marco como Rails necesita una organización más compleja. Utilice lo que mas le guste. Comience
por crear un Rakefile o archivos con una extensión .rake si desea
dividir las tareas de forma lógica en varios archivos. A continuación, defina sus tareas dentro de cualquiera de ellos.
Organización de Rakefile personalizada
Rails lo hace increíblemente fácil. Tiene un Rakefile en la raíz de su aplicación. Contiene lo siguiente:
Rakefile
1 |
require File.expand_path('../config/application', __FILE__) |
2 |
|
3 |
Rails.application.load_tasks |
Cuando tiene muchas tareas personalizadas, tiene más sentido dividirlas en archivos .rake discretos y colocarlos en lib/tasks. El Rakefile de arriba solo los carga, pero el directorio lib es un mejor hogar lógico para las tareas. Incluso hay un generador de Rails para automatizar parte del proceso. Si escribe:
Terminal
1 |
rails generate some_task |
2 |
|
3 |
=> create lib/tasks/some_task.rake |
Obtendras un Rakefile colocado automáticamente en el directorio derecho. Incluso la tarea ya está configurada para ti. ¡Bonito! En
otros proyectos, sin utilizar Rails, sólo necesita crear un directorio
rakelib y colocar sus Rakefiles allí, preferiblemente con extensiones de
archivo .rake. A continuación, crear un archivo llamado Rakefile y todos estos archivos ya están a su disposición.
Anatomía de la tarea de Rake
lib/tasks/some_task.rake
1 |
desc 'List versions of all Rails frameworks and the environment' |
2 |
task :about do |
3 |
puts 'Some magic goes in here…' |
4 |
end
|
Para los novatos de Ruby completos entre ustedes, y para las personas que vienen de los idiomas de paréntesis, esto es como se vería con paréntesis.
1 |
desc('List versions of all Rails frameworks and the environment') |
2 |
task(:about) do |
3 |
puts('Some magic goes in here…') |
4 |
end
|
Parece muy raro, por cierto. Simplemente pierda los paréntesis adicionales—nadie escribe tareas de esta manera.
Proporcionamos
una tarea nombrada :about con una descripción que no sólo nos recuerda
en el futuro lo que queríamos lograr con tareas particulares, sino que
también aparece cuando ejecutamos rake -T. No se perezca en esta parte; Probablemente no vale la pena.
A continuación se muestra la tarea de palabras clave que define una nueva tarea about. Esto se puede invocar en la línea de comando vía rake about el cual hace su magia entonces. Rake :about en el otro lado hará que abortar a Rake, no saber "cómo construir la tarea :about".
A través del bloque do end, tenemos un lambda, y su cuerpo especifica lo que hace la tarea. Esta es la configuración básica que una tarea necesitará. Ofrece muchas más opciones, por supuesto, pero la estructura general es la misma.
requerir / importación
Algun Rakefile
1 |
require './whatever.rb' |
Si necesita incluir otros archivos Ruby o Rakefiles, se puede lograr fácilmente mediante una declaración estándar require.
Algun Rakefile
1 |
import 'whatever.rb' |
Rake mismo nos proporciona otra manera de hacer esto: el método import. Esto se puede utilizar en cualquier línea del Rakefile. Éste
le ayudará cuando tenga problemas porque el archivo requerido se cargó
antes de que el Rakefile terminara de cargar y no continuara. El archivo importado, por otro lado, se cargará siempre después del Rakefile.
Invocar y ejecutar
A veces es posible que desee ejecutar manualmente alguna tarea definida de su clase Task. Para ello, tiene dos métodos de la clase Rake::Task: execute e invoke.
1 |
Rake::Task['some_task'].invoke |
2 |
Rake::Task['some_task'].execute |
Con el código Rake::Task['some_task'], tenemos la tarea Rake some_task para ejecutar. Devuelve una instancia de la clase Rake::Task y luego ejecuta cualquier método en ella que esté disponible.
Espacios de nombres
Una característica muy interesante es la capacidad de espacio de nombres de sus tareas. Probablemente ya has utilizado esto decena de veces. Cuando se ejecuta rake db:migrate, se ha hecho uso del espacio de nombres db, por ejemplo. Invoca la tarea separándola con dos puntos : desde el espacio de nombres. Los espacios de nombres son una forma práctica de organizar sus tareas dentro de un archivo rake—lo que los mantiene lógicamente separados. Varios espacios de nombres como rake time:zones:all están bien, por cierto.
Otros ejemplos incluyen:
1 |
rake db:drop |
2 |
rake db:seed |
3 |
rake log:clear |
4 |
rake spec:views |
5 |
rake spec:models |
6 |
rake db:rollback |
7 |
rake spec:helpers |
8 |
rake spec:features |
9 |
rake db:schema:load |
10 |
rake assets:precompile |
11 |
rake db:migrate:status |
Algun Rakefile
1 |
namespace :db do |
2 |
desc 'Migrating some stuff' |
3 |
task :migrate do |
4 |
...
|
5 |
end
|
6 |
end
|
Esta es la configuración básica. En realidad, es mucho más complicado e incluso puede ser anidado varias veces. Echa un vistazo rápido a la base de código de Rails y comprueba por ti mismo cómo se implementa rake db:migrate. No te sientas mal si es mucho para ti. Basta con mirar a su alrededor, tratar de discernir cómo está estructurado, y seguir adelante por ahora.
Requisitos previos
Otra estrategia para organizar sus tareas y mantenerlas DRY es usar los prerrequisitos para ejecutar una tarea. Es como una dependencia que tiene que ejecutarse antes de que la tarea real comience su trabajo. De esta manera usted puede construir tareas más complejas—tan complejas como necesite. Pero yo recomendaría no ser demasiado listo y mantenerlo tan simple como sea posible—y tan fácil de entender como sea posible.
Algun Rakefile
1 |
task :stop_megalomaniac do |
2 |
puts 'Lots of smart talk, car chases and guns fired' |
3 |
end
|
4 |
|
5 |
task :bond_saves_the_day => :stop_psychotic_megalomaniac do |
6 |
puts 'Lots of Dom Pérignon, oysters and bond girl business' |
7 |
end
|
Si desea confiar en múltiples tareas, simplemente colóquelas en una matriz. Por supuesto, el orden en el que usted los coloca es importante.
1 |
task :get_mr_wolf do |
2 |
puts "You ain’t got no problem Jules, I’m on it! Go in there and chill them out and wait for the wolf who should be coming directly!" |
3 |
end
|
4 |
|
5 |
task :figure_out_bonnie_situation do |
6 |
puts "If I was informed correctly, the clock is ticking. Is that right Jimmy?" |
7 |
end
|
8 |
|
9 |
task :calm_down_jimmy do |
10 |
puts "Jimmy, do me a favor, will you? I smelled some coffee back there. Would you make me a cup?" |
11 |
end
|
12 |
|
13 |
task :get_vince_vega_in_line do |
14 |
puts "Come again? Get it straight buster. I’m not here to say please! I’m here to tell you what to do!" |
15 |
end
|
16 |
|
17 |
task :clean_car do |
18 |
puts "I need you two fellas to take those cleaning products and clean the inside of the car. I’m talking fast, fast, fast!" |
19 |
end
|
20 |
|
21 |
task :clean_crew do |
22 |
puts "Jim, the soap! O.K. gentlemen, you both been to county before I’m sure. Here it comes!" |
23 |
end
|
24 |
|
25 |
task :get_rid_of_evidence_at_monster_joes do |
26 |
puts "So what’s with the outfits? You guys are going to a Volleyball game or something?" |
27 |
end
|
28 |
|
29 |
task :drive_into_the_sunrise do |
30 |
puts "Call me Winston!" |
31 |
end
|
32 |
|
33 |
task :solve_bonnie_situation => [:get_mr_wolf, :calm_down_jimmy, :figure_out_bonnie_situation, :get_vince_vega_in_line, :clean_car, :clean_crew, :get_rid_of_evidence_at_monster_joes, :drive_into_the_sunrise] do |
34 |
puts "You know, I’d go for breakfast. Feel like having breakfast with me?" |
35 |
end
|
Si ejecuta la tarea de rake que depende de la otra, obtendremos la siguiente salida:
Terminal
1 |
$ rake solve_bonnie_situation |
2 |
You ain’t got no problem Jules, I’m on it! Go in there and chill them out and wait for the wolf who should be coming directly! |
3 |
Jimmy, do me a favor, will you? I smelled some coffee back there. Would you make me a cup? |
4 |
If I was informed correctly, the clock is ticking. Is that right Jimmy? |
5 |
Come again? Get it straight buster. I’m not here to say please! I’m here to tell you what to do! |
6 |
I need you two fellas to take those cleaning products and clean the inside of the car. I’m talking fast, fast, fast! |
7 |
Jim, the soap! O.K. gentlemen, you both been to county before I’m sure. Here it comes! |
8 |
So what’s with the outfits? You guys are going to a Volleyball game or something? |
9 |
Call me Winston! |
10 |
You know, I’d go for breakfast. Feel like having breakfast with me? |
El orden en el que se definen las tareas de rastrillo no tiene ningún efecto en la salida—sólo el orden en el que se colocan las tareas de requisito previo en la matriz para las dependencias de tareas. También, utilice la => sintaxis para esto.
Una larga lista de dependencias podría ser un olor de código. Si tienes que lidiar con algo largo, debes limpiarlo encapsulandolo dentro de un método que luego pasamos como un requisito previo.
1 |
def mr_wolf_tasks |
2 |
[:get_mr_wolf, :calm_down_jimmy, :figure_out_bonnie_situation, :get_vince_vega_in_line, :clean_car, :clean_crew, :get_rid_of_evidence_at_monster_joes, :drive_into_the_sunrise] |
3 |
end
|
4 |
|
5 |
...
|
6 |
|
7 |
task :solve_bonnie_situation => mr_wolf_tasks do |
8 |
puts 'You know, I’d go for breakfast. Feel like having breakfast with me?' |
9 |
end
|
En
el contexto de los requisitos previos, una cosa a tener en cuenta es
que sólo necesita mencionar un espacio de nombres si está fuera de la
relevante.
Algun Rakefile
1 |
namespace :marsellus_wallace do |
2 |
task :call_winston_wolf do |
3 |
...
|
4 |
end
|
5 |
end
|
6 |
|
7 |
task :solve_bonnie_situation => 'marsellus_wallace:call_winston_wolf' do |
8 |
...
|
9 |
end
|
10 |
|
11 |
namespace :marsellus_wallace do |
12 |
task :call_winston_wolf do |
13 |
...
|
14 |
end
|
15 |
|
16 |
task :solve_bonnie_situation => :call_winston_wolf do |
17 |
...
|
18 |
end
|
19 |
end
|
Es
importante tener en cuenta, sin embargo: en caso de que necesite
mencionar el espacio de nombres, tiene que pasar el requisito previo
como una cadena => 'marsellus_wallace: call_winston_wolf'.
Por supuesto, los ejemplos anteriores son ejemplos torpes y no de la vida real, pero la intención era mostrar cómo funcionan los prerrequisitos y cómo se unirían mientras dependieran unos de otros.
Pasando Argumentos
Tiene
dos opciones para pasar argumentos a tareas Rake: ya sea mediante el
uso de variables Bash o mediante el uso de la sintaxis de Rake en sí.
Variable ENV
En caso de que no hayas usado Bash antes—o Bash suena a gobbledegook para ti— tomemos cinco y empezamos desde el principio. Bash en tu shell ofrece dos tipos de variables: global (Alias entorno) 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 cierra una variable—distinta a las variables locales de Bash, que sólo están disponibles en el shell actual.
Las
variables de entorno pueden contener datos que pueden ser utilizados
por múltiples aplicaciones y que a menudo se utilizan como una manera
práctica de compartir configuraciones. En contraste con eso, las variables locales de Bash son sólo eso, local. En
nuestro contexto de uso de Rake, usted tiene la capacidad de acceder
tanto a través de Ruby y en efecto pasar variables desde la línea de
comandos.
Para tu información
Al igual que un poco de lado, si escribe 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 lo que son las variables de entorno y lo que incluyen, los animo a ejecutarlo por sí mismos.
Terminal
1 |
env |
Salida
1 |
TERM_PROGRAM=Apple_Terminal |
2 |
TERM=screen-256color |
3 |
SHELL=/bin/bash |
4 |
TMUX=/private/var/folders/4z/3np9k5ks62b1xpbn_w_lmrgh0000gr/T/tmux-504/default,4146,0 |
5 |
EDITOR=vim |
6 |
LANG=en_US.UTF-8 |
7 |
TMUX_PANE=%1 |
8 |
is_vim=echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(view|n?vim?x?)(diff)?$"
|
9 |
... |
10 |
... |
11 |
... |
Si desea ver una lista de variables locales de Bash, puede ejecutar set.
Terminal
1 |
( set -o posix ; set ) | less |
El comando set le da mucho más salida, pero lo anterior le muestra los bits relevantes de inmediato.
Método de la Clase ENV de Ruby
Ruby ofrece una forma de utilizar el entorno y las variables locales de Bash por igual mediante un accesorio similar al hash. Para
nuestras necesidades, cuando pasamos una variable a una tarea de Rake,
va a ser una variable local de Bash, que se puede encontrar en la lista
de variables que se ejecutan en set o una variación de la misma. Ruby puede leerlo usando ENV['VARIABLE'].
Terminal
1 |
rake prepare_book BOOKTITLE='Confessions of a unicorn' |
Lo
que quiero dejar claro, sin embargo, es que esta variable no se
agregará a la lista de ENV que su sistema utiliza, las cosas que vio
llamando env desde el shell. Para agregarla a esa lista, necesitará export. Esta es otra historia, pero pensé que debía dejar esto claro.
Algun Rakefile
1 |
task :prepare_book do |
2 |
book_title = ENV['BOOKTITLE'] || 'Working Title' |
3 |
puts "Do something with the #{book_title}" |
4 |
end
|
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. ENV[BASHVARIABLE] de Ruby que hace todo el trabajo pesado. Si BOOKTITLE hubiera sido una variable de entorno global, sin embargo, podríamos haberla accedido dentro de esta definición de tarea, tambien con esta sintaxis.
Sintaxis del parámetro Rake
El segundo enfoque es usar la sintaxis Rake pura. Simplemente pase las variables en 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 de Bash flotando de esa manera. Si quieres pasar varios argumentos en una tarea, es mucho más elegante también.
Terminal
1 |
rake "create_mi6_agent[James, Bond, 007]" |
Algun Rakefile
1 |
task :create_mi6_agent, [:first_name, :last_name, :number] do |t, args| |
2 |
puts "Number #{args.number} is commander #{args.first_name} #{args.last_name}." |
3 |
end
|
Cuando pasa más argumentos de los que ha definido en su tarea, puede simplemente acceder a ellos a través de args. args.extras muestra una matriz de todos los parámetros adicionalmente pasados. args.to_a muestra todos los parámetros—también en una matriz.
Tareas de interés
A continuación se muestra una breve lista de tareas Rake que vienen con Rails:
- db
- doc
- tmp
- stats
- notes
- about
- secret
- assets
- routes
db
A continuación se presentan algunas tareas útiles en el espacio de nombres db para ejecutar las migraciones de Active Record:
rake db:version imprime la versión actual del esquema. La salida se parece a esto:
1 |
Current version: 20160129135912 |
rake db:migrate ejecuta la(s) última(s) migración (es) — aquellos que aún no se han ejecutado. También puede pasar una migración específica a ejecutar.
Terminal
1 |
rake db:migrate VERSION=20080906120000 |
rake db:create crea su base de datos. Si el valor predeterminado es el desarrollo y las bases de datos de prueba.
1 |
db/development.sqlite3 |
2 |
db/test.sqlite3 |
rake db:test:prepare se asegura de que las migraciones que ya se ejecutan en su
base de datos de desarrollo también se ejecutan para su base de datos
de prueba. Si el esquema de la base de datos de prueba no
estuviera sincronizado con su base de datos de desarrollo, no sería muy
útil, por supuesto.
rake db:drop:all descarta las bases de datos de prueba y de desarrollo de forma predeterminada..
rake db:migrate:up, rake db:migrate:down ejecuta los métodos up y down de la migración en cuestión.
rake db:redo asegura que, después de ejecutar una migración, la migración sea reversible. Ejecuta rake db:down primero y luego rake db:up.
rake db:rollback anula la última migración.
rake db:drop borra por las bases de datos de desarrollo y prueba de forma predeterminada.
rake db:reset descarta primero las bases de datos y las configura de nuevo cargando el esquema y sembrando la base de datos.
doc
rake doc:app genera documentación en doc/app. Crea páginas HTML sobre su código fuente para facilitar la navegación. ¡Muy genial!
Captura



rake doc:rails genera una documentación API en doc/api—también como páginas HTML. Práctico si estás fuera de línea, supongo.
tmp
El
directorio tmp en el directorio raíz de la aplicación Rails es el lugar
de los archivos temporales—los archivos más prominentes para las
sesiones y la memoria caché. rake tmp:create prepara todo lo que necesitas para tratar archivos temporales. rake tmp:cache:clear borra el directorio tmp/cache. rake tmp:sessions:clear borra el directorio tmp/sessions.
stats
rake stats te ofrece una visión general de tu aplicación.
1 |
+----------------------+-------+-------+---------+---------+-----+-------+ |
2 |
| Name | Lines | LOC | Classes | Methods | M/C | LOC/M | |
3 |
+----------------------+-------+-------+---------+---------+-----+-------+ |
4 |
| Controllers | 89 | 69 | 6 | 18 | 3 | 1 | |
5 |
| Helpers | 13 | 13 | 0 | 1 | 0 | 11 | |
6 |
| Models | 89 | 54 | 6 | 7 | 1 | 5 | |
7 |
| Mailers | 0 | 0 | 0 | 0 | 0 | 0 | |
8 |
| Javascripts | 25 | 0 | 0 | 0 | 0 | 0 | |
9 |
| Libraries | 0 | 0 | 0 | 0 | 0 | 0 | |
10 |
| Controller specs | 99 | 81 | 0 | 0 | 0 | 0 | |
11 |
| Feature specs | 14 | 11 | 0 | 0 | 0 | 0 | |
12 |
| Helper specs | 45 | 12 | 0 | 0 | 0 | 0 | |
13 |
| Model specs | 10 | 8 | 0 | 0 | 0 | 0 | |
14 |
| View specs | 60 | 48 | 0 | 0 | 0 | 0 | |
15 |
+----------------------+-------+-------+---------+---------+-----+-------+ |
16 |
| Total | 444 | 296 | 12 | 26 | 2 | 9 | |
17 |
+----------------------+-------+-------+---------+---------+-----+-------+ |
18 |
Code LOC: 136 Test LOC: 160 Code to Test Ratio: 1:1.2 |
notes
Puedes dejar notas en tu código. Puede prefijarlos en sus comentarios con TODO, FIXME, OPTIMIZE.
Algun archivo Ruby
1 |
# FIXME Something to fix here
|
2 |
class Agent < ActiveRecord::Base |
3 |
belongs_to :operation |
4 |
belongs_to :mission |
5 |
|
6 |
...
|
Cuando ejecuta rake notes, Rake analiza estos prefijos y obtiene una lista de todas estas notas de su código.
Terminal
1 |
app/models/agent.rb: |
2 |
* [1] [FIXME] Something to fix here |
Incluso consigue una lista detallada donde usted los
encuentra-directorio, nombre de archivo, número de línea [número de
línea], todo está incluido. Impresionante, ¿verdad?
about
Rake about le ofrece una visión general de los números de versión para:
- Rails
- Ruby
- RubyGems
- Adaptador de base de datos
- Versión del esquema
- Middleware
- Raíz de la aplicación
Y mucha mas información útil.
secret
Si
usted es paranoico acerca de su clave de sesión y desea reemplazarlo,
rake secret generará una nueva clave pseudoaleatoria para
usted. No reemplaza la llave para usted, aunque. La salida en el shell se ve así:
1 |
b40a74b94cd93fed370fd4f8f9333633c03990b7d9128383511de5240acf3fa6b6b07127e875814fdadb32f1aa44d69c4e82592b0ce97f763ea216a21e61881d |
assets
rake assets:precompile le permite precompilar sus activos en public/assets. Si desea deshacerse de activos más antiguos, sólo ejecute rake assets:clean. Por último, ejecutar rake assets:clobber elimina todo el directorio public/assets.
routes
rake routes podría ser el más importante. Te muestra todas las rutas de tu aplicación.
Consideraciones finales
Escribir tareas de Rake sin saber lo que está pasando bajo el capó se pone aburrido bastante rápido. Este artículo fue un poco de calentamiento y la introducción para las personas que querían echar un vistazo en Rake por primera vez.
Espero que cubrió todos los conceptos básicos sin ser demasiado seco—después de todo, Rake es super genial y todo, pero al mismo tiempo, quizás no es el más sexy de los juguetes. Este conocimiento básico de Rake, sin embargo, debe darle todo lo que necesita para ponerse peligroso y ampliar su conocimiento de las tareas Rake que están a su disposición.



