【问题标题】:Installing tiny_tds gem on Ubuntu 20.04 fails在 Ubuntu 20.04 上安装 tiny_tds gem 失败
【发布时间】:2020-09-06 00:37:28
【问题描述】:

我想在 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。

【问题讨论】:

    标签: ruby-on-rails tiny-tds ubuntu-20.04


    【解决方案1】:

    问题

    此问题可能是由升级您的基本操作系统引起的,这可能会更改不同工具的默认路径,例如mkdir。通常,大多数 shell 都遵循PATH 来搜索可执行文件。但是,当您使用 Ruby 和 RVM 安装 gem 时,compiling "native extensions" 的幕后有很多事情要做。传统上,许多 Unix、Linux 和 BSD (*nix) C / C++ 项目将遵循标准的./configure && make && make install 模式。 ./configure 脚​​本通常会在构建时检测有关系统的详细信息,然后自动生成适合该特定系统的 Makefile。在 GNU 系统上,autotools 维护工具还用于自动生成与 POSIX 兼容的./configure 脚本,以及./configure 可以使用的Makefile.in 模板来生成最终的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,但已将旧 rubies 安装到 ~/.rvm 已针对旧操作系统版本进行了预配置。

    所以,这是由不正确的RbConfig::CONFIG 键引起的。在这种情况下:MKDIR_PMAKEDIRS

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

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

    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 键和值,这意味着有很多可能出错的地方。例如:如果某些核心系统库更改了位置或版本,您可能会遇到与链接那些旧的基本操作系统库相关的问题。在这种情况下,最好只重新安装针对您的基本操作系统编译的 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
      

    【讨论】:

      【解决方案2】:

      我在 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
      

      【讨论】:

      • 完美运行。 gem install pg 有同样的问题。所以可能不是 tiny_tds 或 pg 相关问题,而是指向 gem install 命令。
      • 这似乎不是最理想的,因为rvm + mkmf 应该能够从正确的位置使用mkdir。当create_makefilemkdir 由不同的PATH 目录提供的系统上创建MakefileMKDIR_PMAKEDIRS = /usr/bin/mkdir -p 时,此问题可能发生在外部本机扩展构建中:/bin/mkdir。该问题可以通过修复RbConfig::CONFIG 键来解决:MAKEDIRSMKDIR_P。检查你的:ruby -rrbconfig -e 'puts RbConfig::CONFIG'
      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 2011-05-15
      • 2021-07-03
      • 2021-08-23
      相关资源
      最近更新 更多