0

好的,所以这是我的第一个问题。我准备好感觉自己很愚蠢,但是就这样吧。

在熟悉 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 找错了地方。

但是,如果我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位于 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=...到GEM PATH.bashrc

编辑:睡过之后,我明白为什么上面的第二个选项也不起作用。简单地将缺少的目录添加到 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_path和指示bin_path,它们都在rubygems代码中定义。

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

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

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

提前致谢!

4

1 回答 1

0

试试这个文件:

配置.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

于 2019-10-07T20:05:34.913 回答