O que significa 'bin' em '$ bin/rails?'
-
26-12-2019 - |
Pergunta
Eu estou tentando seguir junto "como Começar com Motores" Trilhos de Guia tutorial e achei isso:
$ bin/rails plugin new blorgh --mountable
Quando eu escreva isso no meu terminal, eu recebo:
bash: bin/rails: No such file or directory
Quando eu tento apenas $ rails
ele funciona OK.
Estou usando a linha de comando para um par de meses, e os Trilhos bem.Eu sei que o sinal$, mas eu estou confuso sobre o significado do "bin" depois disso.Eu sou usado tipo de "Trilhos" logo após $, mas este tutorial diz que o uso de "bin" ...
O que faz bin/
significa?
Solução
tl;dr
Executar bundle install --binstubs
e ele vai trabalhar.Você só precisa fazer isso uma vez e Bundler vai se lembrar que você pediu para ele (para o projeto).
Resposta longa
Quando você instala um pacote com bundle --binstubs
, Bundler irá instalar todos do seu pacote específico para o binstubs bin/
subdiretório (relativo ao Gemfile), ao invés de colocá-los no gemset global binstub caminhos.
Você normalmente faria isso para:
- Certifique-se de que o
rails
binstub você está executando é o único em seu Gemfile (em oposição a uma versão diferente do que tem instalado em seu gemset mais tarde, separado do Bundler), e - Para melhorar o tempo de execução (já que é funcionalmente equivalente a
bundle exec rails
exceto, menos um subprocesso de invocação).
Global binstubs vs Bundler binstubs
Se você digitar which rails
, você vai ter um longo caminho como /usr/local/rvm/gems/jruby-1.7.18/bin/rails
, e o conteúdo que: 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)
Após a execução bundler --binstubs
, se você cat bin/rails
, você terá 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')
A principal diferença que há é que o bin/
a versão define o BUNDLE_GEMFILE
variável de ambiente, e requer bundler/setup
, que é o que informa Bundler para ir fazer a sua coisa com gema caminhos.O bin/rails
script é bundler-conhecimento, e está ciente do seu Gemfile, portanto, pode preparar o ambiente para a direita fora do bastão.
Eu geralmente recomendo usar --binstubs
e bin/x
invocações sobre o gemset versões.
Outras dicas
Considere este cenário:
Eu tinha um app que estava usando Rails versão 4.0.0.Meu objetivo era atualizar ele para o Rails 4.1.9.Para fazer isso, eu tentei atualizá-lo passo-a-passo:primeiro, a atualização para versão 4.0.13, em seguida, 4.1 e finalmente 4.1.9.
Tudo correu bem.Todos os testes foram passando utilizando RSpec.
Finalmente, eu tentei executar o meu servidor com rails s
.Booom!Ruby caiu.Então, eu usei bin/rails s
.Correu tudo ok.
Então, eu acho que se você tem outra versão do rails, configurado no seu sistema, é mais seguro usar bin/rails
opção.
P. S.Para se certificar de que a minha suposição é correta, eu removi todos os trilhos versão exceto 4.1.9 e, em seguida, eu tentei executar o servidor com rails s
.Não falhar desta vez.
Espero que isso esclarece.
Quando você executar um executável através do shell em um sistema operacional baseado em unix, o caminho do sistema vai ser procurado em primeiro lugar.Para ver todos os diretórios em seu $PATH
, tente isso a partir de seu terminal de comandos:
echo $PATH
os trilhos executável estará presente em um dos diretórios listados.
Edite - O texto abaixo é completamente errado, as minhas desculpas
Opcionalmente, a partir da raiz do seu trilhos de diretório, você pode executar o arquivo executável no diretório bin.Para fazer isso, que é, para garantir que você está executando o executável local e não foi encontrado em seu $PATH
, você precisa de um". " antes do comando.Assim,
./bin/rails
não
bin/rails