0
  • 捆绑器v1.2.3
  • RubyGems v1.8.24
  • RVM(最新)
  • 导轨v3.2.9

我在我的 Rails 应用程序中使用 binstubs 和这些默认值(~/bundle/config):

---
BUNDLE_PATH: .bundle
BUNDLE_BIN: .bundle/bin

然后我添加.bundle/bin$PATH(通过 chwd 上的 zsh 脚本,所以它不是一个巨大的安全漏洞)所以我有正确的 gem 二进制文件可用。

这基本上没问题,除了两个问题。

第一期

当我 cd 进入应用程序并键入时,gem list我会得到一个全局安装的 gems列表(不是应用程序的 gems)。对于应用程序宝石,我需要输入bundle exec gem list并且它可以工作。我可以忍受这一点。

第 2 期

我不能安装任何本地(应用程序的本地)gem,它们位于捆绑包之外(即它们不在 Gemfile 中)。gem-ctags gem就是一个这样的例子。

我理论上可以将它安装到与所有其他本地 gem 相同的目录中:

gem install --install-dir .bundle/ gem-ctags

但是我没有办法使用它,它正在输入这个命令:

☺ gem ctags
ERROR:  While executing gem ... (RuntimeError)
    Unknown command ctags

☹ bundle exec gem ctags
ERROR:  While executing gem ... (RuntimeError)
    Unknown command ctags

有没有办法让它工作?

PS:

  • 当我安装gem-ctags到全局 gem 中然后执行gem ctags它时它应该正常工作)
  • 我知道ruby​​gems -bundler但我宁愿让 binstubs 工作而不是使用它(除非没有其他方法......)

更新

第 3 期

gem cleanup不起作用,即使我正确设置了 $GEM_PATH (如@mpapis 建议的那样):

☺ gem cleanup                                                                       
Cleaning up installed gems...
Attempting to uninstall rake-10.0.0
Unable to uninstall rake-10.0.0:
    Gem::InstallError: gem "rake" is not installed
Attempting to uninstall ffi-1.1.5
Unable to uninstall ffi-1.1.5:
    Gem::InstallError: gem "ffi" is not installed
Attempting to uninstall dalli-2.2.1
Unable to uninstall dalli-2.2.1:
    Gem::InstallError: gem "dalli" is not installed
Clean Up Complete

当我输入gem install.

4

2 回答 2

1

如果你想使用.bundle/你需要把宝石放进去Gemfile

您正在尝试在 之外使用 ruby​​gems 插件GEM_PATH,以使其正常工作,您必须这样做:

export GEM_PATH="$GEM_PATH:$PWD/.bundle"

第三季度更新:

根据帮助:

$ gem help cleanup
...
  Description:
    The cleanup command removes old gems from GEM_HOME.  If an older version is
    installed elsewhere in GEM_PATH the cleanup command won't touch it.

这意味着您需要:

export GEM_HOME="$PWD/.bundle"

作为副作用,它应该消除对--install-dir .bundle/

就像您知道的那样 - 您正在为 bundler 和 ruby​​gems 做一些意想不到的事情,而且 RVM 显然还没有为您的流程做好准备。

于 2012-12-14T16:15:39.543 回答
0

作为参考,这是我如何在zsh 中动态添加和添加.bundle/bin以使一切正常(即上述两个问题都已解决):$PATH.bundle$GEM_PATH

export DEFAULT_GEM_HOME=$GEM_HOME

autoload -U add-zsh-hook
add-zsh-hook chpwd chpwd_add_binstubs_to_paths

function chpwd_add_binstubs_to_paths {
  # always delete from $OLDPWD (.bundle/bin/ from $PATH and .bundle/ from $GEM_PATH)
  export PATH=${PATH//$OLDPWD\/\.bundle\/bin:}
  export GEM_PATH=${GEM_PATH//$OLDPWD\/\.bundle:}
  export GEM_HOME=$DEFAULT_GEM_HOME

  if [ -r $PWD/Gemfile.lock ] && [ -d $PWD/.bundle/bin ]; then
    # add .bundle/bin to $PATH and .bundle/ to $GEM_PATH (deleting existing entries first)
    export PATH=$PWD/.bundle/bin:${PATH//$PWD\/\.bundle\/bin:}
    export GEM_PATH=$PWD/.bundle:${GEM_PATH//$PWD\/\.bundle:}
    export GEM_HOME=$PWD/.bundle
  fi
}

# initially execute `chpwd_add_binstubs_to_paths` as we might be opening a new shell in Rails project's directory
chpwd_add_binstubs_to_paths
于 2012-12-15T17:25:01.527 回答