1

我想在 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,激活 Ruby 2.7 的 RVM。

4

2 回答 2

10

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

$ which mkdir
/bin/mkdir

由于该进程正在搜索其中的命令,/usr/bin/mkdir因此无法找到。我可以通过创建指向正确路径的符号链接来解决此问题:

sudo ln -s /bin/mkdir /usr/bin/mkdir
于 2020-06-03T09:34:18.293 回答
3

问题

此问题可能是由升级您的基本操作系统引起的,这可能会更改不同工具的默认路径,例如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 installbundle install需要为某些东西编译原生 C/C++ 扩展时,它还会生成一个Makefile带有系统特定细节的内容。在此示例中,发现mkdir实用程序应位于/usr/bin/mkdir.

作为此过程的一部分,gem会mkmkf自动生成. 但是,在这种情况下,实用程序实际上位于. 因此,现在您的系统的设置不正确。这可能是因为您升级到 Ubuntu 20.04,但安装了旧的 rubies,已经为旧的操作系统版本进行了预配置。Makefileextconf.rbRbConfig::CONFIGmkdir/bin/mkdirRbConfig::CONFIG~/.rvm

因此,这是由不正确的RbConfig::CONFIG密钥引起的。在这种情况下:MKDIR_PMAKEDIRS

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

有时您只需要快速破解来修复工具的路径。这在很多情况下都有效,但有时当您的基本操作系统发生很大变化时会导致问题。在这种情况下,请使用下面的完全清洁和重新安装方法。

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

     find ~/.rvm/rubies/$(rvm current | cut -d@ -f1) -iname 'rbconfig.rb'
    
  2. 编辑文件并修复对象上的MKDIR_PMAKEDIRSRbConfig::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"
    
  3. 保存文件并重试您的gem install命令:

     gem install tiny_tds
    

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

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

  1. 重新安装你的红宝石

     # -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
    
于 2020-07-26T02:56:44.643 回答