Rackup LoadError - любой файл config.ru выдает LoadError при использовании команды rackup - PullRequest
0 голосов
/ 07 октября 2019

Хорошо, это мой первый вопрос. Я готов к тому, что чувствую себя глупым, но здесь все.

В настоящее время я изучаю Ruby, прежде чем я познакомлюсь с Ruby on Rails. Я прошел онлайн-курс, и на данном этапе мы только что узнали, как использовать стеллаж для обработки логики сервера и запустить файл config.ru для запуска сервера.

Но каждый раз, когда я пытаюсь запустить сервер с использованием rackup, я получаю LoadError вот так:

    1: from /usr/local/bin/rackup:23:in `<main>'
/usr/local/bin/rackup:23:in `load': cannot load such file -- /usr/lib/ruby/gems/2.5.0/gems/rack-2.0.7/bin/rackup (LoadError)```

Теперь я ударился головой о все возможные углы, которые я могу придумать. Я понимаю, что эта ошибка говорит о том, что путь, по которому команда rackup пытается загрузить код стойки, не существует. Я попытался создать несколько разных файлов .ru, чтобы проверить, не является ли это проблемой с shebang, проблемой с содержимым файла .ru и так далее. Но, похоже, это не так. Я даже не могу запустить пример файла lobster.ru, который входит в комплект поставки стойки. Я получаю ту же ошибку.

Я также попытался переустановить гем стойки, изменив его версию по умолчанию. Ни то, ни другое не помогло. Я подумывал об использовании разных версий Ruby, но это не казалось актуальным. Проблема, очевидно, в том, что рэкап выглядит не в том месте.

Но, если я использую require 'rack' на простом сервере ruby, проблем не возникнет. Стойка работает. Так что все это говорит мне, что это должно быть связано с самой командой rackup.

Действительно, когда я перехожу на /usr/lib/ruby/gems/2.5.0/gems, каталог rack-2.0.7 отсутствует. Вместо этого этот каталог находится в var/lib/gems/2.5.0/gems

Я заметил, что var/lib/gems/2.5.0 находится в GEM PATHS среды RubyGems. Но /usr/lib/ruby/gems/2.5.0' - это не так.

Так что мои идеи по решению проблемы были такими:

  1. Изменить способ загрузки в стойку драгоценного камня. Я посмотрел на это, и это означало бы изменить то, что выглядит как действительно правильный код в rubygems или даже в файлах рэкапа. Я сломаю это, если я буду вмешиваться в это, потому что я понятия не имею, что я делаю. Это не разумный вариант.

  2. Добавьте usr/lib... в ПУТЬ ДРАГОЦЕННОГО КАМНЯ, чтобы при поиске драгоценностей в стойке он мог его найти. Поискав немного об этой возможности, кажется, что добавлять вещи в GEM PATH вручную не рекомендуется. Я все равно попробовал ... но он не работалЯ могу понять, почему второй вариант, описанный выше, тоже не работает.Простое добавление отсутствующего каталога в GEM PATH или в $ LOAD_PATH не поможет, потому что rackup ищет определенное место для rack, но не может его найти. Если я смотрю на код стойки, он выглядит так:

    if Gem.respond_to?(:activate_bin_path)
    load Gem.activate_bin_path('rack', 'rackup', version)
    else
    gem "rack", version
    load Gem.bin_path("rack", "rackup", version)
    end
    

    Сегменты кода, выполняющие поиск, направляются :activate_bin_path и bin_path, которые оба определены в коде rubygems.

    Так что, если я правильно понимаю, это похоже на то, как рэппак получает неправильные указания к месту, которое не существует. Как будто он поворачивает направо, когда должен идти влево. Я могу либо как-то изменить направлениесказать ему «иди налево» или построить то, что он ищет, «справа».

    Убедиться, что оно «идет влево» - лучшее решение, но я не могу понять, как это сделать. Поэтому я построил то, что он ищет, направильно ': я скопировал гем стойки в каталог /usr/lib/ruby/gems/2.5.0/gems/, в котором просматривает rackup. Он решил проблему не найти то, что ищет, - rackup теперь работает и сервер работает. НО это решение будет преследовать меня в будущем, например, если стойка будет обновлена ​​... Это варварское решение, и я бы предпочел элегантное.

    Так что, если у кого-то есть понимание того, как убедиться, что стойка получила правильные указания, пожалуйста, дайте мне знать! Я думаю, что это как-то связано с тем, чтобы убедиться, что рубины bin_path и :activate_bin_path соответствуют тому, где драгоценные камни фактически установлены. На данный момент фундаментальное несоответствие заключается в том, что драгоценные камни живут в var, а выглядят в usr.

    Заранее спасибо!

1 Ответ

0 голосов
/ 07 октября 2019

Попробуйте этот файл:

config.ru

app = ->(env){

    status = 200
    headers = {"content-type" => "text/html"}
    body = ["<Html><Body><H1>Hello, World!</H1></Body></Html>"]

    [status, headers, body]

}

run app

rackup config.ru

...