¿Qué significa 'bin' en '$ bin/rails?'
-
26-12-2019 - |
Pregunta
Estoy tratando de seguir el tutorial de la Guía Rails "Introducción a los motores" y encontré esto:
$ bin/rails plugin new blorgh --mountable
Cuando escribo esto en mi terminal, aparece:
bash: bin/rails: No such file or directory
Cuando lo intento solo $ rails
funciona bien.
He estado usando la línea de comandos durante un par de meses y Rails también.Conozco el signo $ pero estoy confundido acerca del significado del "contenedor" después de eso.Estoy acostumbrado a escribir "Rails" justo después de $, pero este tutorial dice que use "bin"...
Que hace bin/
¿significar?
Solución
tl; dr
Correr bundle install --binstubs
y funcionará.Sólo tienes que hacerlo una vez y Bundler recordará que lo pediste (para ese proyecto).
respuesta más larga
Cuando instalas un paquete con bundle --binstubs
, Bundler instalará todos los binstubs específicos de su paquete en el bin/
subdirectorio (relativo al Gemfile), en lugar de colocarlos en las rutas binstub globales del conjunto de gemas.
Normalmente harías esto para:
- Asegúrese de que el
rails
binstub que estás ejecutando es el que está en tu Gemfile (a diferencia de una versión diferente que se instaló en tu conjunto de gemas más tarde, separada de Bundler), y - Para mejorar el tiempo de ejecución (ya que es funcionalmente equivalente a
bundle exec rails
excepto menos una invocación de subproceso).
Binstubs globales frente a binstubs de Bundler
si escribes which rails
, obtendrás un camino largo como /usr/local/rvm/gems/jruby-1.7.18/bin/rails
, y cuyo contenido: cat `which rails`
#!/usr/bin/env jruby_executable_hooks
#
# This file was generated by RubyGems.
#
# The application 'railties' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/
version = $1
ARGV.shift
end
end
gem 'railties', version
load Gem.bin_path('railties', 'rails', version)
despues de correr bundler --binstubs
, si usted cat bin/rails
, obtendrás algo como:
#!/usr/bin/env jruby
#
# This file was generated by Bundler.
#
# The application 'rails' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'pathname'
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
Pathname.new(__FILE__).realpath)
require 'rubygems'
require 'bundler/setup'
load Gem.bin_path('railties', 'rails')
La diferencia clave es que el bin/
La versión establece el BUNDLE_GEMFILE
variable de entorno, y requiere bundler/setup
, que es lo que le dice a Bundler que haga lo suyo con los caminos de gemas.El bin/rails
El script reconoce el paquete y conoce su Gemfile, por lo que puede preparar su entorno de inmediato.
Generalmente recomiendo usar --binstubs
y bin/x
invocaciones sobre las versiones de conjuntos de gemas.
Otros consejos
Considere este escenario:
Tenía una aplicación que usaba Rails versión 4.0.0.Mi objetivo era actualizarlo a Rails 4.1.9.Para hacerlo, intenté actualizarlo paso a paso:primero, actualizando a 4.0.13, luego 4.1 y finalmente 4.1.9.
Todo salió bien.Todas las pruebas pasaron usando RSpec.
Finalmente, intenté ejecutar mi servidor con rails s
.¡Auge!Ruby se estrelló.Entonces, usé bin/rails s
.Todo salió bien.
Entonces creo que si tienes una versión diferente de rieles configurados en tu sistema, es más seguro usarlos. bin/rails
opción.
PDPara asegurarme de que mi suposición sea correcta, eliminé todas las versiones de Rails excepto la 4.1.9 y luego intenté volver a ejecutar el servidor con rails s
.Esta vez no hay ningún accidente.
Espero que esto se aclare.
Cuando ejecuta un ejecutable a través de Shell en un sistema operativo basado en Unix, primero se buscará la ruta de su sistema.Para ver todos los directorios en su $PATH
, prueba esto desde el indicador de tu terminal:
echo $PATH
El ejecutable de Rails estará presente en uno de los directorios enumerados.
Editar: el texto siguiente es completamente incorrecto, mis disculpas.
Opcionalmente, desde la raíz de su directorio Rails, puede ejecutar el ejecutable en el directorio bin.Para hacer esto, es decir, para asegurarse de que está ejecutando el ejecutable local y no uno que se encuentre en su $PATH
, tu necesitas un '.' antes de la comando.Entonces,
./bin/rails
no
bin/rails