是否可以从本地缓存捆绑/安装gem?

时间:2011-12-19 20:24:18

标签: ruby caching gem bundle

我的计算机上有一堆宝石,我想在厨师食谱中使用。

我知道可以将它们放在像/ tmp / gems这样的目录中,只需:

cd /tmp/gems
gem install *.gem

是否可以将所有宝石放在一个目录中,我可以使用捆绑器安装它们而无需再次下载它们?

cd /somedir/my_rails_project
bundle

我想节省带宽。

5 个答案:

答案 0 :(得分:28)

bundle install --local应该是你想要的。来自bundle-install联机帮助页:

--local
    Do not attempt to connect to rubygems.org, instead using just the 
    gems located in vendor/cache. Note that if a more appropriate 
    platform-specific gem exists on rubygems.org, this will bypass 
    the normal lookup.

答案 1 :(得分:5)

您可以将本地目录添加到Gemfile(示例来自文档):

gem "nokogiri", :path => "~/sw/gems/nokogiri"

或者,你可以设置一个包含gems的本地Git存储库,并编写一个这样的Gem文件:

gem "gem1", :git    => "file:///tmp/gems",
            :branch => "gem1"

答案 2 :(得分:4)

使用

bundle package
  

锁定然后将gems缓存到./vendor/cache。

     

package命令将复制gems中的.gem文件   捆绑成./vendor/cache。之后,当您运行bundle install时,   Bundler将使用缓存中的gem而不是那些gems   rubygems.org。

http://bundler.io/v1.6/bundle_package.html

答案 3 :(得分:1)

如果要使用本地缓存来加速CI上的bundle install,例如,当使用docker容器运行测试时,可以使用--path。这将使用给定路径中的gem,除非它们不存在,否则它将下载到该位置。

这假设CI构建可以在docker容器中安装持久卷。因此,例如,如果CI计算机的目录/var/cache/drone可以作为./cache安装在docker容器中,那么您可以执行以下操作:

bundle install --without=development --quiet --path=cache

答案 4 :(得分:0)

您可以使用BUNDLE_CACHE_PATH配置密钥:

  

cache_pathBUNDLE_CACHE_PATH):运行bundle package时,捆绑程序将在其中放置缓存的gems的目录,在安装gems时,该捆绑程序将查找的目录。默认为vendor/bundle

来源:https://bundler.io/v1.16/bundle_config.html#LIST-OF-AVAILABLE-KEYS

在GitLab CI中,我在运行程序环境"BUNDLE_CACHE_PATH=/cache-ci/bundle"中定义了此值:此目录自动安装在CI运行程序中。

然后bundle install将从缓存目录中安装gem(一旦填充了缓存)。