Вопрос

Я пытаюсь следовать руководству 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.

Обычно вы бы сделали это, чтобы:

  1. Убедитесь, что rails binstub, который вы используете, находится в вашем Gemfile (в отличие от другой версии, которая была установлена в ваш gemset позже, отдельно от Bundler), и
  2. Чтобы увеличить время выполнения (поскольку это функционально эквивалентно 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top