Что означает «bin» в «$ bin/rails»?
-
26-12-2019 - |
Вопрос
Я пытаюсь следовать руководству Rails Guide «Начало работы с движками» и нашел это:
$ bin/rails plugin new blorgh --mountable
Когда я печатаю это на своем терминале, я получаю:
bash: bin/rails: No such file or directory
Когда я пытаюсь просто $ rails
это работает нормально.
Я использую командную строку уже пару месяцев, а также Rails.Я знаю знак $, но после этого меня смущает значение слова «корзина».Я привык вводить «Rails» сразу после $, но в этом уроке сказано, что нужно использовать «bin»…
Что значит bin/
иметь в виду?
Решение
tl;dr
Бежать bundle install --binstubs
и это сработает.Вам нужно сделать это только один раз, и Bundler запомнит, что вы просили об этом (для данного проекта).
Более длинный ответ
Когда вы устанавливаете пакет с bundle --binstubs
, Bundler установит все привязки к вашему конкретному пакету в bin/
подкаталог (относительно Gemfile), вместо того чтобы помещать их в глобальные пути к binstub gemset.
Обычно вы бы сделали это, чтобы:
- Убедитесь, что
rails
binstub, который вы используете, находится в вашем Gemfile (в отличие от другой версии, которая была установлена в ваш gemset позже, отдельно от Bundler), и - Чтобы увеличить время выполнения (поскольку это функционально эквивалентно
bundle exec rails
за исключением минус одного вызова подпроцесса).
Глобальные связующие элементы против связующих элементов Bundler
Если вы наберете which rails
, вы получите длинный путь, подобный /usr/local/rvm/gems/jruby-1.7.18/bin/rails
, и содержание которого: 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)
После запуска bundler --binstubs
, если вы cat bin/rails
, вы получите что-то вроде:
#!/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')
Ключевое отличие здесь заключается в том, что bin/
версия устанавливает BUNDLE_GEMFILE
переменная окружения, и для этого требуется bundler/setup
, что и подсказывает Bundler делать свое дело с путями драгоценных камней.Тот Самый bin/rails
скрипт поддерживает пакетирование и знает о вашем Gemfile, поэтому он может подготовить вашу среду сразу же.
Обычно я рекомендую использовать --binstubs
и bin/x
вызовы поверх версий gemset.
Другие советы
Рассмотрим этот сценарий:
У меня было приложение, использующее Rails версии 4.0.0.Моей целью было обновить его до Rails 4.1.9.Для этого я попытался обновить его шаг за шагом:сначала обновился до 4.0.13, затем 4.1 и наконец 4.1.9.
Все прошло гладко.Все тесты проходили с использованием RSpec.
Наконец, я попытался запустить свой сервер с помощью rails s
.Бум!Руби разбился.Затем я использовал bin/rails s
.Все прошло ок.
Поэтому я думаю, что если в вашей системе установлена другая версия рельсов, безопаснее использовать bin/rails
вариант.
P.S.Чтобы убедиться в правильности моего предположения, я удалил все версии рельсов, кроме 4.1.9, а затем попытался перезапустить сервер с помощью rails s
.На этот раз никакого сбоя.
Надеюсь, это прояснит.
Когда вы запускаете исполняемый файл через оболочку в операционной системе на базе Unix, сначала будет выполнен поиск вашего системного пути.Чтобы просмотреть все каталоги в вашем $PATH
, попробуйте это из командной строки терминала:
echo $PATH
исполняемый файл рельсов будет находиться в одном из перечисленных каталогов.
Изменить. Текст ниже совершенно неверен, прошу прощения.
При желании из корня вашего каталога рельсов вы можете запустить исполняемый файл в каталоге bin.Чтобы сделать это, то есть убедиться, что вы используете локальный исполняемый файл, а не тот, который находится в вашем $PATH
, тебе необходимо '.' Перед командой.Так,
./bin/rails
нет
bin/rails