如何在使用bundle install –deployment时包含bundler本身

我正在尝试供应我的ruby应用程序,这样我就不必在服务器上手动安装任何gem,并且可以在我们的puppet设置中将我的应用程序部署为rpm。

这几乎可以工作,除非我向Gemfile添加了一个require’bundler’,没有捆绑器的痕迹进入供应商目录。 所以,我的应用程序失败了

no such file to load -- bundler 

正是在加载我们的依赖关系的点上。

 require 'bundler' Bundler.setup 

有没有明显的东西我在这里丢失或捆绑商实际上不能自己供应?

为了它的价值,我正在使用jruby 1.7.8并且有问题的应用程序具有以下Gemfile:

 # run with --local to use locally cached gems # bundle install --full-index --without testing development # vendorized setup for production # bundle install --full-index --without testing development --deployment source 'https://rubygems.org' gem 'bundler' gem 'sinatra' gem 'sinatra-flash' gem 'sinatra-contrib' gem 'rack-parser', :require => 'rack/parser' gem 'dynamic_attributes', :github => 'joona/dynamic_attributes', :require => false gem 'httparty' gem 'haml' gem 'json' gem 'airbrake' # gem 'rake' #gem 'omniauth-google' # TO-DO: deprecate gem 'bcrypt-ruby', :require => 'bcrypt' gem 'oauth' gem 'oauth2' gem 'omniauth' gem 'omniauth-dropbox' gem 'omniauth-facebook' gem 'omniauth-google-oauth2' gem 'omniauth-linkedin' gem 'omniauth-twitter' gem 'omniauth-windowslive', :git => 'git://github.com/joona/omniauth-windowslive.git' gem 'lumber' gem "log4r-gelf" gem "resque", :github => "resque/resque", :branch => '1-x-stable' gem "resque-pool" gem 'tux', :require => false gem 'actionmailer' gem 'actionpack', '4.0.1' gem 'activesupport', '4.0.1', :require => false gem 'activerecord', '4.0.1' platforms :jruby do gem 'activerecord-jdbc-adapter' #, :github => 'jruby/activerecord-jdbc-adapter' gem 'jdbc-mysql' gem 'activerecord-jdbcmysql-adapter' end platforms :ruby do gem 'mysql2' end group :testing do gem 'shoulda-matchers', :require => false gem 'webmock', '1.8.0', :require => false gem 'database_cleaner', '1.0.1' gem "sequel", "~> 4.3.0", :require => false gem 'rspec' gem 'capybara' #gem 'vcr' gem 'simplecov', :require => false gem 'launchy' gem 'rack-test', :require => false gem 'faker' gem 'fabrication' gem 'sinatra-sessionography', :require => false platforms :ruby do gem 'sqlite3' end platforms :jruby do gem 'jdbc-sqlite3' end end # group :development do gem 'guard', "1.8.3", :require => false gem 'guard-sass', '1.3.2', :require => false gem 'guard-less', '0.1.2', :require => false gem 'guard-process', '1.0.6', :require => false gem 'guard-rspec', '3.1.0', :require => false gem 'juicer' gem 'foreman', :require => false # shotgun with logging quickfix! #gem 'shotgun', :github => 'joona/shotgun' gem 'guard-shotgun', :git => 'https://github.com/rchampourlier/guard-shotgun.git' gem 'capistrano', '~> 2' gem 'rvm-capistrano' end group :production do platforms :ruby do gem 'passenger' end platforms :jruby do gem 'fishwife' end end 

这不起作用的原因是因为Bundler.setup是实际设置加载路径以查找销售gem的代码。 如果出售Bundler,它将无法找到它来进行设置。

你可以做以下两件事之一:

  1. 将Bundler安装为系统gem。 这是最常见的解决方案。 您可以构建一个单独的RPM来安装它(或者可能已经有一个可以使用它),并在您的应用程序的RPM中依赖它。

  2. 使用Bundler的独立模式 。 这将为您提供一个完全不依赖于Bundler的应用程序。 在这种情况下,您应该从应用程序中删除Bundler.setup require 'bundler'Bundler.setup行,而是添加require_relative 'bundle/bundler/setup' (如果您从位于其他位置的文件中调用它,则调整路径)项目的根目录)。