在 Ubuntu 20.04 上安装 tiny_tds gem 失败

Installing tiny_tds gem on Ubuntu 20.04 fails

我想在 Ubuntu 20.04 上安装 tiny_tds,所以我这样做了

apt install freetds-dev

并安装 gem

gem install tiny_tds

在 Ubuntu 18.04 上非常有效,但 20.04 失败了。输出的最后一行是:

current directory: /home/myuser/.rvm/gems/ruby-2.7.0/gems/tiny_tds-2.1.2/ext/tiny_tds
make "DESTDIR=" install
make: /usr/bin/mkdir: Command not found
make: *** [Makefile:202: .sitearchdir.-.tiny_tds.time] Error 127

make install failed, exit code 2

关于如何解决这个问题有什么想法吗? 我有 Ubuntu 20.04,RVM Ruby 2.7 活跃。

我在 Ubuntu 20.04 上安装 gems 时遇到了类似的问题。使用 RVM 和 Ruby 2.7。 如前所述,make 进程找不到 mkdir 命令。

$ which mkdir
/bin/mkdir

由于进程正在搜索 /usr/bin/mkdir 中的命令,因此找不到。我可以通过为正确的路径创建一个符号 link 来解决这个问题:

sudo ln -s /bin/mkdir /usr/bin/mkdir

问题

此问题可能是由于升级您的基础 OS 引起的,这可能会更改 mkdir 等不同工具的默认路径。通常,大多数遵循 PATH to search for an executable. However, when you're installing gems using Ruby & RVM, there is a lot going on behind the scenes for . Traditionally many Unix, Linux & BSD (*nix) C / C++ projects will follow the standard ./configure && make && make install pattern. The ./configure script generally detect details about the system at build-time, then auto-generate a Makefile catered to that particular system. On GNU systems, the autotools 维护者工具的 shell 也用于自动生成 POSIX 兼容的 ./configure 脚本,以及 Makefile.in 可以使用的模板 ./configure 生成最终的 Makefile.

gem installbundle install 需要为某些东西编译原生 C / C++ 扩展时,它还会生成一个 Makefile 以及系统特定的详细信息。在此示例中,发现 mkdir 实用程序应位于 /usr/bin/mkdir.

作为此过程的一部分,mkmkf gem 会自动生成一个 Makefile,通常来自 extconf.rb 脚本,其配置与您的系统相匹配,来自 RbConfig::CONFIG。但是,在这种情况下,mkdir 实用程序实际上位于 /bin/mkdir。因此,RbConfig::CONFIG 设置现在对您的系统不正确。这可能是因为您升级到 Ubuntu 20.04,但是安装了旧的红宝石 ~/.rvm 已经为旧的 OS 版本进行了预配置。

所以,这是由于 RbConfig::CONFIG 键不正确造成的。在这种情况下:MKDIR_PMAKEDIRS.

解决方案(快速破解方法)

有时您只需要快速破解即可修复工具的路径。这在很多情况下都可行,但有时当您的基础 OS 发生很大变化时可能会导致问题。在这种情况下,请使用下面的完整清理和重新安装方法。

  1. 使用 RVM 查找当前 rbconfig.rb 文件:

     find ~/.rvm/rubies/$(rvm current | cut -d@ -f1) -iname 'rbconfig.rb'
    
  2. 编辑文件并修复 RbConfig::CONFIG 对象上的 MKDIR_PMAKEDIRS 键:

     # 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"
    
  3. 保存文件并重试您的 gem install 命令:

     gem install tiny_tds
    

解决方案(完全清理重新安装方法)

通常,不建议手动编辑 rbconfig.rb,因为它是在编译 Ruby 本身时从 ./configure 脚本生成的。有很多 RbConfig::CONFIG 键和值,这意味着有很多可能出错的地方。例如:如果某些核心系统库更改了位置或版本,您可能 运行 会遇到与链接那些旧基础 OS 库相关的问题。在这种情况下,最好只重新安装一个 ruby 针对你的 OS.

编译的
  1. 重新安装 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)
    
  2. 重试您的 gem install 命令:

     gem install tiny_tds