开发工具 rbenv gemset 使用心得 for zsh

doitian · 2012年04月07日 · 6402 次阅读

[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


gemset

# 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


bundler alias

##################################################
# 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/

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