好吧,这是我的第一个问题。我准备好让自己变傻了,但现在开始了。
在熟悉Rails之前,我目前正在学习Ruby。我一直在学习一门在线课程,在这个时候,我们刚刚学习了如何使用齿条来处理服务器的一些逻辑,以及如何运行一个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,但这似乎不相关。问题显然是拉皮条找错地方了。
但是,如果我在简单的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路径中。但/usr/lib/ruby/gems/2.5.0'不是。
因此,我对解决这一问题的想法是:
usr/lib...添加到GEM路径,以便当rackup和rubygems查找rackup和rubygems时可以找到它。搜索了一下这种可能性之后,似乎不建议手动向GEM路径添加内容。我尝试了它--它没有工作(FYI,我通过向.bashrc添加export GEM_PATH=...来添加到GEM路径
编辑:睡过觉后,我明白为什么上面的第二个选项也不起作用。简单地将缺失的目录添加到GEM路径或$LOAD_PATH不会有帮助,因为rackup正在寻找一个特定的位置,但找不到它。如果我查看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代码中定义的。
所以,如果我正确地理解了这一点,它就像是把错误的方向指向了一个不存在的地方。就像它应该向左拐时向右拐一样。我的选择是要么以某种方式改变它的方向,告诉它“向左走”,要么把它想要的东西建在“右边”。
确保它“左转”是更好的解决方案,但我不知道如何做到这一点。因此,我构建了它寻找的‘在右边’的东西:我将rackup正在查找的rackup目录中的齿条创业板复制到/usr/lib/ruby/gems/2.5.0/gems/目录。它解决了rackup找不到它正在寻找的东西的问题-- rackup现在可以工作,服务器也可以工作。但是这个解决方案将来会困扰我,例如,如果机架被更新.这是一个野蛮的解决方案,我更喜欢优雅的解决方案。
因此,如果有人对如何确保rackup得到正确的方向有洞察力,请告诉我!我认为这一定与确保rubygems、bin_path和:activate_bin_path与实际安装宝石的位置相对应有关。目前,根本上的差异似乎是,宝石生活在var,但它的外观在usr。
提前感谢!
发布于 2019-10-07 20:05:34
试试这个文件:
config.ru
app = ->(env){
status = 200
headers = {"content-type" => "text/html"}
body = ["<Html><Body><H1>Hello, World!</H1></Body></Html>"]
[status, headers, body]
}
run apprackup config.ru
https://stackoverflow.com/questions/58275650
复制相似问题