Ruby mac liunx 关于在终端中执行 ruby gem 包命令的疑惑?

lb563 · 2012年02月21日 · 最后由 leomao10 回复于 2012年02月22日 · 6552 次阅读

类似于 capsitrano 这个包,当你装上后。便可以到终端运行 cap 命令, 一直很模糊这个命令是怎么就被加到当前环境中了. 当然对于 ruby 知道他是怎么加到我环境中去的。至于 gem 我就很模糊,虽然 gem env 拿出了 gem 包的路径,但是没有明确指出这些 gem 命令的地址。难道有什么机制来执行?

which cap 不太会解释

~:$ echo $PATH
/home/rei/bin:/home/rei/bin:/usr/local/rvm/gems/ree-1.8.7-2011.03/bin:/usr/local/rvm/gems/ree-1.8.7-2011.03@global/bin:/usr/local/rvm/rubies/ree-1.8.7-2011.03/bin:/usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

每個標準的 ruby gem 都應該帶有個 gemspec 的檔案 gemspec 裡只是 ruby code,應該遵照 rubygems 的規矩寫好各種參數 其中一個設定的參數 executables 便是用來說明 gem 本身提供了什麼命令 而 rubygems 在安裝這個 gem 時 便會把 executables 設定的命令安裝到使用者的 bin path

你可以看看 capistrano 的 gemspec 設定 https://github.com/capistrano/capistrano/blob/master/capistrano.gemspec

s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }

它呼叫了 shell 列出 bin 下面的檔案 而 capistrano gem 的 bin 下面有 cap 及 capify https://github.com/capistrano/capistrano/tree/master/bin

因此當你執行了 gem install capistrano cap 及 capify 便會被安裝到使用者的 bin path 去

#3 楼 @v1nc3ntlaw 嗯 谢谢。我明白了!

多谢二楼,又学到了些新东西

需要 登录 后方可回复, 如果你还没有账号请 注册新账号