[rbenv-gemset][] 是 [rbenv][] 一个插件,支持在目录树中使用指定的 gemsets。和 [rvm][] 相比,因为文件.rbenv-gemsets
并不包含任意可执行代码,不需要人肉确定是否信任。
安装只需要把 rbenv-gemset
clone 到 .rbenv/plugins
里。使用方法很简单,在需要使用 gemsets
的目录上建立文件,用空格分开所有 gemsets
。其中第一个 gemset
也会作为 gems 安装目录。
注意如果要指定 ruby 版本,需要使用 rbenv local
方法。
在 rvm
中一个很方便的功能就是可以在指定的 gemset
中执行一个命令,而 rbenv-gemset
则必须更改 .rbenv-gemsets
文件,很容易会忘记改回来。好在可以通过 RBENV_GEMSET_FILE
指定文件,所以可以建立个临时文件,写入要用的 gemsets
。在 zsh
中可以使用 =(<<<arg)
(see zshexpn(1) Process Substitution
),见下面包装函数 gemset
。原来的 rbenv gemset
二级命令仍然可以使用,比如 gemset list
。如果第一个参数不是有效的命令,会当成 .rbenv-gemsets
文件的内容。比如在 gemset generator
中执行 rails
命令
gemset generator rails
这样可以把一些常用命令安装到单独的 gemset 中,保持环境整洁(洁癖有木有)。示例:
gemset generator gem install rails gemset tools gem install github tmuxinator gemset deploy gem install capistrano capistrano-ext bundler gemset debug gem install pry pry-doc awesome_print rbenv rehash
为方便使用可以建立 alias (rvm users 也可以这么干)
alias github='gemset tools github' alias gh=github alias tmuxinator="gemset tools tmuxinator" alias cap='gemset deploy cap' alias capify='gemset deploy capify' alias pry='gemset debug pry' alias irb='pry'
rails 命令比较特殊,我希望是在有 Gemfile
的目录树中使用 bundler 指定的版本,而在其它目录中使用 gemset generator 中的版本,见最后面的 bundler alias
# unset global RBENV_GEMSET_FILE to get a clean environment.
# For example, tmuxinator may set this because it is a Ruby gem.
unset RBENV_GEMSET_FILE
function gemset() {
if [ -z "$1" ]; then
rbenv gemset active
else
local action="$1"
shift
case "$action" in
active|create|delete|file|list|version)
rbenv gemset "$action" "$@"
;;
*)
RBENV_GEMSET_FILE==(<<<"$action") "$@"
;;
esac
fi
}
# completion function for gemset
function _gemset() {
local -a _actions _gemsets
_actions=(active create delete file list version)
_gemsets=($(rbenv gemset list | grep '^ ' | uniq))
_arguments ":action: _values actions ${_actions} ${_gemsets}" '*::arguments: _sudo'
}
compdef _gemset gemset
##################################################
# Bundle Alias
# from oh-my-zsh bundler plugin
alias be="bundle exec"
alias bi="bundle install"
alias bl="bundle list"
alias bp="bundle package"
alias bu="bundle update"
bundled_commands=(cucumber foreman guard nanoc3 rackup rails rainbows rake rspec shotgun spec spork thin unicorn unicorn_rails knife)
_bundler-installed() {
which bundle > /dev/null 2>&1
}
_within-bundled-project() {
local check_dir=$PWD
while [ "$(dirname $check_dir)" != "/" ]; do
[ -f "$check_dir/Gemfile" ] && return
check_dir="$(dirname $check_dir)"
done
false
}
bundler-exec() {
if _bundler-installed && _within-bundled-project; then
bundle exec "$@"
else
case "$1" in
nanoc3|rails)
gemset generator "$@"
;;
*)
"$@"
;;
esac
fi
}
compdef _sudo bundler-exec
## Main program
for cmd in $bundled_commands; do
alias $cmd="bundler-exec $cmd"
done
摘自我的 zsh 配置 rbenv.zsh
[rbenv]: https://github.com/sstephenson/rbenv [rbenv-gemset]: https://github.com/sstephenson/rbenv-gemset [rvm]: http://beginrescueend.com/