Webrick已从Ruby 3.0.0中删除,并且在构建Sinatra的环境时感到困惑


我叫Onoda Kenta(@onoda_kenta)。我是编程的初学者。

作为学习Ruby的一部分,我决定使用Sinatra而不是Rails来创建一个简单的Web应用程序。

我使用Docker来构建环境,但是由于Ruby的图像是Ruby:最新的版本变成了Ruby 3.0.0,在引入它时我有点困惑,所以我想分享一下。

根据结论,

  • Webrick已从Ruby 3.0.0中删除
  • 执行需要薄,彪马,卷轴,HTTP,Webrick等应用程序服务器
  • 如果要使用webrick,请从RubyGems安装
  • 或使用Ruby 2.x系列

然后,我想实际构建环境。

环境

作为前提,这次使用的环境如下。

  • Windows 10专业版20H2 64位
  • WSL 2 Ubuntu 20.04 LTS
  • Docker 20.10.2版
  • Ruby 3.0.0
  • 辛纳屈2.1.0
  • webrick 1.7.0

使用Docker Ruby 3.0.0构建Sinatra环境

Sinatra:我想按照README中描述的过程使用Docker构建环境。

从Ruby 3.0.0的映像启动容器

首先,启动Ruby容器。

1
$ docker container run -it -d -p 4567:4567 --name sinatra_test ruby:latest

添加了

-it -d选项以使Ruby容器在后台运行。

Sinatra默认使用端口号4567进行通信,因此使用-p将容器端口号4567分配给主机端口号4567。

这次我用--name命名了容器sinatra_test。

1
2
3
4
5
Unable to find image 'ruby:latest' locally

~中略~

d4f1f93f0c61eb98d1007f2012e3d4d5225e9d3996e809c609be1ab6e1586169

让我们检查正在运行的容器。

1
$ docker container ls
1
2
CONTAINER ID   IMAGE         COMMAND   CREATED         STATUS         PORTS                    NAMES
d4f1f93f0c61   ruby:latest   "irb"     6 minutes ago   Up 6 minutes   0.0.0.0:4567->4567/tcp   sinatra_test

Ruby容器已正确启动。

rb文件的执行

接下来,准备运行Sinatra的rb文件。

1
2
3
$ mkdir sinatra_test
$ cd sinatra_test
~/sinatra_test$ touch myapp.rb

首先,创建一个工作目录。这次我选择了sinatra_test。转到您创建的sinatra_test目录,并创建一个名为myapp.rb的文件。

myapp.rb

1
2
3
4
5
require 'sinatra'

get '/' do
  'Hello world!'
end

myapp.rb如上所述。

myapp.rb复制到容器中。

1
~/sinatra_test$ docker container cp myapp.rb sinatra_test:/

从这里开始,我们将在容器内工作。

1
$ docker container exec -it sinatra_test bash
1
root@d4f1f93f0c61:/#

我把它放在一个容器中。首先,让我们看看复制的myapp.rb是否存在。

1
root@d4f1f93f0c61:/# ls
1
bin  boot  dev  etc  home  lib  lib64  media  mnt  myapp.rb  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

接下来,让我们检查一下ruby的版本。

1
root@d4f1f93f0c61:/# ruby -v
1
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]

安装Sinatra。

1
root@d4f1f93f0c61:/# gem install sinatra
1
2
3
4
5
6
Fetching sinatra-2.1.0.gem

~中略~

Successfully installed sinatra-2.1.0
6 gems installed

这应该通过运行myapp.rb启动Web应用程序。使用-o将??host设置为localhost。让我们运行它。

1
root@d4f1f93f0c61:/# ruby myapp.rb -o 0.0.0.0
1
2
3
/usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1755:in `detect_rack_handler': Server handler (thin,puma,reel,HTTP,webrick) not found. (RuntimeError)
        from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1493:in `run!'
        from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/main.rb:45:in `block in <module:Sinatra>'

我得到一个错误,它没有开始。它说找不到服务器处理程序(瘦,彪马,卷轴,HTTP,webrick)。

Ruby 3.0.0发行版具有以下描述。

从2.7起的其他显着变化

  • 以下库已从标准附加库中删除。如果要在3.0或更高版本中使用它,请从rubygems使用它。

    • sdbm
    • 韦布里克
    • 远程登录
    • xmlrpc

服务器似乎没有启动,因为已删除了名为webrick的应用程序服务器的库,该库在Ruby 3.0.0中作为Ruby 2.7的标准配置而被附加。

安装webrick

Webrick被删除,您应该在rubygems中使用它,因此我将再次安装webrick。

1
root@d4f1f93f0c61:/# gem install webrick
1
2
3
Fetching webrick-1.7.0.gem
Successfully installed webrick-1.7.0
1 gem installed

webrick已安装,因此让我们再次运行myapp.rb。

1
root@d4f1f93f0c61:/# ruby myapp.rb -o 0.0.0.0
1
2
3
4
[2021-01-28 14:04:00] INFO  WEBrick 1.7.0
[2021-01-28 14:04:00] INFO  ruby 3.0.0 (2020-12-25) [x86_64-linux]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2021-01-28 14:04:00] INFO  WEBrick::HTTPServer#start: pid=36 port=4567

它安全启动。如果在此状态下访问http://本地主机:4567 /,将显示Hello world!。

对于Ruby 2.7.2

顺便说一下,R??uby 2.x系列标配了webrick,因此,如果在安装Sinatra后运行myapp.rb,服务器将启动。我会尝试的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ docker container run -it -d -p 4567:4567 --name sinatra_test ruby:2.7.2

~中略~

root@e66f1ebb8a85:/# ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]
root@e66f1ebb8a85:/# gem install sinatra

~中略~

Successfully installed sinatra-2.1.0
6 gems installed
root@e66f1ebb8a85:/# ruby myapp.rb -o 0.0.0.0
[2021-01-28 14:16:35] INFO  WEBrick 1.6.0
[2021-01-28 14:16:35] INFO  ruby 2.7.2 (2020-10-01) [x86_64-linux]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2021-01-28 14:16:35] INFO  WEBrick::HTTPServer#start: pid=24 port=4567

除了容器图像是ruby之外,我执行了与以前相同的过程:2.7.2。安装Sinatra后,无需运行$ gem install webrick就可以运行myapp.rb,服务器将正常启动。

概括

这次,当使用Docker构建Sinatra环境时,由于ruby:最新发生了一个错误。正如我在构建Sinatra环境的开始时所写的那样,我认为您应该了解以下几点。

  • Webrick已从Ruby 3.0.0中删除
  • 执行需要薄,彪马,卷轴,HTTP,Webrick等应用程序服务器
  • 如果要使用webrick,请从RubyGems安装
  • 或使用Ruby 2.x系列

另外,我发现在基于网络上的信息构建环境时,最好准备尽可能多的版本,而不仅限于这种情况。

希望本文对您有所帮助。

参考网站

  • Sinatra:README(日语)
  • Ruby 3.0.0版本