问题
此问题可能是由升级您的基本操作系统引起的,这可能会更改不同工具的默认路径,例如mkdir
. 通常,大多数外壳程序都遵循PATH
搜索可执行文件。但是,当您使用 Ruby 和 RVM 安装 gems 时,在后台编译“本机扩展”有很多事情要做。传统上,许多 Unix、Linux 和 BSD (*nix) C / C++ 项目将遵循标准./configure && make && make install
模式。该./configure
脚本通常在构建时检测有关系统的详细信息,然后自动生成一个Makefile
迎合该特定系统的信息。在 GNU 系统上,autotools
维护工具还用于自动生成 POSIX 兼容的./configure
脚本,以及Makefile.in
可用于./configure
生成最终版本的模板Makefile
.
当gem install
或bundle install
需要为某些东西编译原生 C/C++ 扩展时,它还会生成一个Makefile
带有系统特定细节的内容。在此示例中,发现mkdir
实用程序应位于/usr/bin/mkdir
.
作为此过程的一部分,gem会mkmkf
自动生成. 但是,在这种情况下,实用程序实际上位于. 因此,现在您的系统的设置不正确。这可能是因为您升级到 Ubuntu 20.04,但安装了旧的 rubies,已经为旧的操作系统版本进行了预配置。Makefile
extconf.rb
RbConfig::CONFIG
mkdir
/bin/mkdir
RbConfig::CONFIG
~/.rvm
因此,这是由不正确的RbConfig::CONFIG
密钥引起的。在这种情况下:MKDIR_P
或MAKEDIRS
。
解决方案(快速破解方法)
有时您只需要快速破解来修复工具的路径。这在很多情况下都有效,但有时当您的基本操作系统发生很大变化时会导致问题。在这种情况下,请使用下面的完全清洁和重新安装方法。
rbconfig.rb
使用 RVM查找当前文件:
find ~/.rvm/rubies/$(rvm current | cut -d@ -f1) -iname 'rbconfig.rb'
编辑文件并修复对象上的MKDIR_P
和MAKEDIRS
键RbConfig::CONFIG
:
# Your path may be different. Use the one you found from Step #1
$EDITOR ~/.rvm/rubies/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/rbconfig.rb
# Now change the lines:
CONFIG["MAKEDIRS"] = "/usr/bin/mkdir -p"
CONFIG["MKDIR_P"] = "/usr/bin/mkdir -p"
# To:
CONFIG["MAKEDIRS"] = "/bin/mkdir -p"
CONFIG["MKDIR_P"] = "/bin/mkdir -p"
保存文件并重试您的gem install
命令:
gem install tiny_tds
解决方案(完全清洁重新安装方法)
通常rbconfig.rb
不建议手动编辑,因为它是./configure
在编译 Ruby 本身时从脚本生成的。有很多RbConfig::CONFIG
键和值,这意味着有很多可能出错的地方。例如:如果某些核心系统库更改了位置或版本,您可能会遇到与链接那些旧的基本操作系统库相关的问题。在这种情况下,最好只重新安装针对您的基本操作系统编译的 ruby。
重新安装你的红宝石
# -j $(nproc) is optional... but can speed up your build by using multiple CPU cores.
# If you don't have the 'nproc' tool, just pass the number of CPU cores to `-j`
rvm reinstall --disable-binary $(rvm current | cut -d@ -f1) -j $(nproc)
重试您的gem install
命令:
gem install tiny_tds