我的计算机上有一堆宝石,我想在厨师食谱中使用。
我知道可以将它们放在像/ tmp / gems这样的目录中,只需:
cd /tmp/gems
gem install *.gem
是否可以将所有宝石放在一个目录中,我可以使用捆绑器安装它们而无需再次下载它们?
cd /somedir/my_rails_project
bundle
我想节省带宽。
答案 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。
答案 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_path
(BUNDLE_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(一旦填充了缓存)。