【问题标题】:Rackup LoadError - any config.ru file gives LoadError when rackup command usedRackup LoadError - 任何 config.ru 文件在使用 rackup 命令时都会出现 LoadError
【发布时间】:2019-10-07 19:03:18
【问题描述】:

好的,这是我的第一个问题。我正在为自己的愚蠢做准备,但这里就是这样。

在熟悉 Ruby on Rails 之前,我目前正在学习 Ruby。我一直在关注一个在线课程,此时我们刚刚学习了如何使用 rack 来处理服务器的一些逻辑,并运行一个 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 文件的内容的问题等等。但情况似乎并非如此。我什至无法运行 rack gem 附带的示例 lobster.ru 文件。我犯了同样的错误。

我还尝试重新安装 rack gem,更改它的默认版本。都没有帮助。我考虑过使用不同版本的 Ruby,但这似乎并不相关。问题显然是 rackup 找错了地方。

但是,如果我在一个简单的 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' 不是。

所以我解决这个问题的想法是:

  1. 更改 rackup 加载 rack gem 的方式。我对此进行了研究,这意味着更改 ruby​​gems 甚至机架文件中看起来非常正确的代码。如果我篡改它,我会破坏它,因为我不知道我在做什么。这不是一个明智的选择。

  2. usr/lib... 添加到 GEM PATH,以便 rackup 和 ruby​​gems 查找 rack gem 时可以找到它。对这种可能性进行了一些搜索后,似乎不建议手动将内容添加到 GEM PATH 中。无论如何我都试过了......但它没有用(仅供参考,我通过将 export GEM_PATH=... 添加到 .bashrc 来添加到 GEM PATH

编辑:睡过之后,我明白为什么上面的第二个选项也不起作用。简单地将缺少的目录添加到 GEM PATH 或 $LOAD_PATH 将无济于事,因为 rackup 正在寻找 rack 的特定位置但找不到它。如果我查看 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_pathbin_path 指导,它们都在rubygems 代码中定义。

因此,如果我正确理解这一点,它就像机架将错误的方向带到一个不存在的地方。就像它应该向左转的时候向右转一样。我的选择是要么以某种方式改变它的方向来告诉它“向左走”,要么建造它正在寻找的东西“在右边”。

确保它“向左走”是更好的解决方案,但我不知道该怎么做。所以我在“右边”构建了它正在寻找的东西:我将 rack gem 复制到 rackup 正在查找的 /usr/lib/ruby/gems/2.5.0/gems/ 目录。它解决了 rackup 找不到它正在寻找的东西的问题 - rackup 现在可以工作并且服务器工作。但是这个解决方案将来会困扰我,例如如果 rack 更新......这是一个野蛮的解决方案,我更喜欢一个优雅的解决方案。

因此,如果有人对如何确保 rackup 获得正确的方向有深入了解,请告诉我!我认为这一定与确保 ruby​​gems bin_path:activate_bin_path 与 gem 的实际安装位​​置相对应有关。目前,根本的差异似乎是宝石位于var,但它位于usr

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby rubygems rack rackup


    【解决方案1】:

    试试这个文件:

    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
    

    机架配置.ru

    【讨论】:

    • 谢谢。我试过这个,但我仍然得到同样的错误:Traceback (most recent call last): 1: from /usr/local/bin/rackup:23:in `&lt;main&gt;' /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)
    • 尝试在终端 gem 列表中运行此命令 | grep -e puma -e thin -e webrick
    • 打印webrick (1.5.0, default: 1.4.2)
    • 好吧,你确实有一个网络服务器(webrick),所以如果你在与 config.ru 文件相同的文件夹中调用 rackup,rackup 应该可以工作。我会发布您的操作系统规格,也许有人可以弄清楚。
    • 谢谢 - 我完全是个菜鸟,所以我不确定你所说的操作系统规格到底是什么意思。我使用的是 Ubuntu,但我应该包含更多细节吗?比如具体是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多