配置gem安装目录匹配用户安装目录

Configure gem installation directory to match user installation directory

我熟悉 node/npm 方式,并尝试使用 ruby/gem/bundler 进行设置。

gem env 的输出包括这些行:

  - RUBYGEMS VERSION: 2.7.6
  - RUBY VERSION: 2.5.1 (2018-03-29 patchlevel 57) [x86_64-darwin17]
  - INSTALLATION DIRECTORY: /opt/local/lib/ruby2.5/gems/2.5.0
  - USER INSTALLATION DIRECTORY: /Users/ssterling3/.gem/ruby/2.5.0

(我不明白为什么 ruby 2.5.1 的 gems 会安装在名为 2.5.0 的目录中,但这不是这个问题的问题。)

我不希望 gem 触及 $HOME 之外的任何东西,我希望以一种我永远不必编辑的方式来触碰 $HOME当我升级 ruby 或将 $HOME 的内容移动到另一台我有不同用户名的计算机时。

(当然,我必须重新安装所有 gem 之类的东西,这也不是这个问题的目的。)

我认为正确的做法是覆盖默认值 INSTALLATION DIRECTORY 并将其设置为始终匹配默认值 USER INSTALLATION DIRECTORY.

我该怎么做?

我知道我可以通过设置 $GEM_HOME 来覆盖 INSTALLATION DIRECTORY,但我不知道如何让 gem 以我的方式输出 USER INSTALLATION DIRECTORY在设置 $GEM_HOME 之前不必解析。我可以从 gem env gemdir 得到 INSTALLATION DIRECTORY,但是 gem env --user-install gemdirInvalid option

(为什么一个值有三个不同的名称,而一个密切相关的值只有最不可用的类似名称也不是这个问题的问题。)

我知道我可以在 $HOME/.gemrc 中配置一些东西,但是我找到的文档和示例并没有告诉我如何操作 INSTALLATION DIRECTORY。听起来我可以通过添加行 gem: --user-install 来做到这一点,但对于 installuninstallupdate 可能至少需要三行,但是添加带有 gem: 的行不会改变 gem env 的输出,所以也许 none 真的会做我想要的。

我最终将这种暴行放入我的初始化脚本中:

if [ ! -z "`which gem`" ]; then
        GEM_HOME=`prefix="  - USER INSTALLATION DIRECTORY: "; line=\`gem env | grep "^$prefix"\`; suffix=${line#$prefix}; echo $suffix`
fi;

您可以更新环境变量。对于我的输出:

  - RUBY VERSION: 2.5.1 (2018-03-29 patchlevel 57) [x86_64-linux]
  - INSTALLATION DIRECTORY: /home/ivan/.rvm/gems/ruby-2.5.1
  - USER INSTALLATION DIRECTORY: /home/ivan/.gem/ruby/2.5.0
  - RUBY EXECUTABLE: /home/ivan/.rvm/rubies/ruby-2.5.1/bin/ruby
  - EXECUTABLE DIRECTORY: /home/ivan/.rvm/gems/ruby-2.5.1/bin
  - SPEC CACHE DIRECTORY: /home/ivan/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /home/ivan/.rvm/rubies/ruby-2.5.1/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /home/ivan/.rvm/gems/ruby-2.5.1
     - /home/ivan/.rvm/gems/ruby-2.5.1@global

我的文件位于此处:

home/ivan/.rvm/gems/ruby-2.5.1/environment

请注意 environment 文件位于 GEM PATHS 第一个路径中。

重要:我应该通过以下方式重新加载变量:

source home/ivan/.rvm/gems/ruby-2.5.1/environment

或在大多数 shell 中更快:

. home/ivan/.rvm/gems/ruby-2.5.1/environment