将路径/ gem_home与' bundler / inline',rbenv和全局红宝石结合使用

时间:2017-03-20 10:56:45

标签: ruby bundler rbenv

为了制作独立且可移植的ruby脚本,我使用bundler/inline

我配置此脚本的服务器非常具体,它们具有rbenv(因此我们可以回滚/使用多个ruby版本)以及安装某些gem(备份gem)的时间。我们使用全局ruby安装。

使用' bundle / inline'产生的脚本由非root用户执行抛出错误:

Your user account isn't allowed to install to the system Rubygems.
You can cancel this installation and run:  

    bundle install --path vendor/bundle

to install the gems into ./vendor/bundle/, or you can enter your password
and install the bundled gems to Rubygems using sudo.

可悲的是,bundler / inline没有选择将此作为参数。

所以我尝试通过设置捆绑路径来解决此问题:bundle config path ~/.gem/ruby/2.3.0/,但这不起作用。 (我检查并正确保存了配置)

设置GEM_HOME=~/.gem/ruby/2.3.0/确实有效。 (Ruby gems为这种情况支持两个gem home,所以这实际上工作正常)。唯一的问题是我需要做一些簿记,以保持环境变量与rbenv激活的ruby的次要版本一致。我无法从我的ruby脚本中设置这个ENV,我可以根据当前版本轻松计算出这个版本:

version_used_for_gem_home = RUBY_VERSION.gsub /\.\d+$/, '.0'
ENV['GEM_HOME'] = "/var/lib/postgresql/.gem/ruby/#{version_used_for_gem_home}/"
require 'bundler/inline'

有没有更好的解决方案,不要求我做任何簿记?我希望有一些rbenv钩子我可以用来修改路径/ gem home ...

1 个答案:

答案 0 :(得分:0)

我们遇到了同样的问题,我发现这就是诀窍

require 'bundler/inline'
require 'bundler'
Bundler.configure # where the magic happens
# passing true here does the install; in real scripts we
# pass a boolean based on a --install flag.
gemfile(true) do 
   ...gems go here...
end

您需要明确调用Bundler.configure以使其读取您的包配置,并正确设置路径。