RubyGems 如何修改$PATH



当你安装一个带有 bin 目录的 gem 时,它会自动添加到 zsh 和 bash 中的$PATH中。 红宝石如何在不修改您的 bashrc、bash_profile 或任何其他预壳脚本的情况下做到这一点?

当您安装带有 bin 目录的 gem 时,它会自动添加到 zsh 和 bash 中的$PATH中。

这个问题读起来好像$PATH在安装 gem 时纵了。不是。相反,宝石安装在$PATH上的某个地方,这是相当普遍的。我相信(未经测试),当您安装 rubyrubygems 时,gem environment变量EXECUTABLE DIRECTORY值(对我来说默认值为 /usr/bin)将添加到$PATH中,如果它不存在。但是,由于/usr/bin应该$PATH,这是未经检验的猜想,我找不到文档来支持这一理论。

在我对rake(我能想到的第一个分发可执行文件的 gem)的测试中,我的/usr/bin/rakeversion 0.8.7变成了version 0.9.2.2。我的$PATH没有被sudo gem install rake命令所触动。

这是有道理的,因为RubyGems是一个版本控制系统。它会自动处理 gem 版本,将最新版本符号链接(或类似 - 可能是复制并覆盖)到您的$PATH中,而无需修改$PATH本身。我认为/usr/bin/是一个常见的$PATH位置。

我不确定 OP 在哪个平台上工作。以下内容至少与OS X相关。

gem environment


  ...SNIP...
  - EXECUTABLE DIRECTORY: /usr/bin
  ...SNIP...
  - GEM PATHS:
     - /Library/Ruby/Gems/1.8
     - /Users/simont/.gem/ruby/1.8
     - /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8

因此,EXECUTABLE DIRECTORY是我们放置捆绑在 Gem 中的可执行文件/bin的地方,GEM PATHS是我们放置 gem 本身的地方。我相当确定,如果您查看GEM PATHS,您可以找到同一 gem 的多个版本,包括它们的/bin目录,但只有链接到EXECUTABLE DIRECTORY的最新可执行文件。

以问题中提到的方式"手动"编辑$PATH将取决于平台并且有些难以实现(例如,bash vs zsh vs tsch启动文件,以及 Windows vs OS X vs Linux vs $OTHER_OS环境变量都有很大差异),并且(以我的拙见)也会有点"粗鲁"。

最新更新