类似于 capsitrano 这个包,当你装上后。便可以到终端运行 cap 命令, 一直很模糊这个命令是怎么就被加到当前环境中了. 当然对于 ruby 知道他是怎么加到我环境中去的。至于 gem 我就很模糊,虽然 gem env 拿出了 gem 包的路径,但是没有明确指出这些 gem 命令的地址。难道有什么机制来执行?
which cap 不太会解释
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 嗯 谢谢。我明白了!
多谢二楼,又学到了些新东西