好,这是我的第一个问题。我为感到愚蠢而准备,但现在开始吧。
我在熟悉Ruby on Rails之前正在学习Ruby。我一直在学习在线课程,在这一刻,我们刚刚学习了如何使用机架来处理服务器的某些逻辑,以及如何运行config.ru文件来启动服务器。
但是,每次我尝试使用机架启动服务器时,都会得到如下所示的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文件。我犯了同样的错误。
我还尝试过重新安装机架gem,更改其默认版本。都没有帮助。我考虑过使用不同版本的Ruby,但这似乎并不重要。问题很明显是机架出现在错误的位置。
但是,如果我在简单的ruby服务器上使用require 'rack'
,则没有任何问题。机架工作。因此,所有这些都告诉我,这必须与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
位于RubyGems环境的GEM PATHS中。但是/usr/lib/ruby/gems/2.5.0'
不是。
所以我对解决这个问题的想法是:
更改机架加载机架gem的方式。我研究了这个问题,这意味着更改在rubygems甚至连机架文件中看起来正确的代码。如果我篡改它,我会破坏它,因为我不知道自己在做什么。这不是明智的选择。
将usr/lib...
添加到GEM路径,以便在rackup和rubygems查找机架宝石时,可以找到它。搜索了一下这种可能性之后,似乎不建议手动将其添加到GEM PATH中。无论如何,我还是尝试了...但是它没有用(仅供参考,我通过在export GEM_PATH=...
上添加.bashrc
将其添加到GEM PATH
编辑:睡过头了,我知道为什么上面的第二个选项也不起作用。只是将缺少的目录添加到GEM PATH或$ LOAD_PATH中将无济于事,因为rackup正在寻找机架的特定位置但找不到。如果我查看机架代码,则如下所示:
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
代码中定义。
因此,如果我正确理解这一点,它就像是在将错误的路线指引到不存在的地方。好像它应该向左转时向右转。我的选择是要么以某种方式改变方向以告诉它“向左走”,要么构建其在“向右走”中寻找的东西。
确保它“离开”是更好的解决方案,但我不知道该怎么做。因此,我建立了它在“右侧”寻找的内容:我将机架gem复制到了rackup要查找的/usr/lib/ruby/gems/2.5.0/gems/
目录中。它解决了rackup找不到所需内容的问题-现在,ackup可以正常工作了,服务器正常工作。但是这种解决方案将来会困扰我,例如如果机架已更新...这是一种野蛮的解决方案,而我更喜欢一种优雅的解决方案。
[因此,如果有人对如何确保机架获得正确的方向有所了解,请告诉我!我认为必须与确保rubygems bin_path
和:activate_bin_path
与实际安装宝石的位置有关。目前,基本差异似乎是宝石存在于var
中,但外观却在usr
中。
谢谢!
好,这是我的第一个问题。我为感到愚蠢而准备,但这是可行的。在熟悉Ruby on Rails之前,我目前正在学习Ruby。我一直在学习在线课程,并且...
尝试此文件:
config.ru