模块化包通过给你更多的选择,修复了单一系统Ruby包的最大抱怨。让我们看看如何在Fedora、CentOS Stream或Rocky Linux中从模块化软件包中安装不同的Ruby版本。
虽然我是chruby的粉丝(请看我对ruby-build和ruby-install的比较),但漫长的编译时间是我所害怕的。很多时候,我只是使用系统包。
系统包安装快速(无需编译!),易于维护(免费的安全更新!),但有一件事阻止了大多数人使用它们:软件库中只有一个版本。这正是模块化软件包想要解决的问题。
自从Fedora 28时代以来,我们得到了一个额外的RPM仓库,叫做Fedora Modular。它是一个可以让你安装模块化软件包的仓库,并且应该在默认情况下为你安装。这个仓库在RHEL、CentOS Stream和Rocky Linux上被称为AppStream。但本质上它是一样的东西。
通过dnf module list ,我们可以看到所有可用的模块。我把它限定为Ruby。
$ dnf module list | grep ruby
ruby 2.7 default [d] An interpreter of object-oriented scripting language
ruby 3.0 default [d] An interpreter of object-oriented scripting language
现在,我们正在谈论!我们不是只有一个版本,而是有两个;一个是2.7.x系列,一个是新的Ruby 3.0。是的,我们没有得到每一个Ruby,因为维护的负担太高了,但是现在有了选择。
注意,上面的输出是来自新鲜的Fedora 35。还要注意的是,在基本的ruby 包中仍然有一个系统Ruby可用。但是回到模块上。
上面的输出列出了模块名称(ruby )和流(2.7 和3.0 ),所以版本并不是真正的版本,而是一个流。
为了安装一个模块包,我们启用一个模块并安装它。
$ sudo dnf module enable module-name
$ sudo dnf module install module-name
或者,我们指定我们想要的流。
$ sudo dnf module enable module-name:stream
$ sudo dnf module install module-name:stream
所以要安装Ruby 2.7,我首先安装ruby 模块的2.7 流。
$ sudo dnf module enable ruby:2.7
$ sudo dnf module install ruby:2.7
module install 命令将安装默认的配置文件(软件包集)。一旦流被启用,也可以用通常的dnf install 来安装其RPM包。比起基本的系统包,流包会被优先考虑。
一旦完成,我们应该就可以使用Ruby 2.7了。
$ ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
编译Ruby是我在更新服务器或重建Docker容器时最长的一个步骤。有了模块化包,我们几乎可以立即得到Ruby。
我们后来可以用删除模块。
$ sudo dnf module remove module-name
一旦我们想切换到一个不同的流,我们必须在启用新的流之前运行reset ,之后再运行distro-sync 。
$ sudo dnf module reset module-name
$ sudo dnf module enable module-name:stream
$ sudo dnf module install module-name:stream
$ sudo dnf distro-sync
虽然模块化提供了更多的版本,但一个模块的流并不意味着可以一起使用。你需要决定你想要的版本,而不是用它们来同时开发许多项目。