我正在使用标准的bundler / capistrano配方,它在部署后在服务器上安装所有必需的宝石:update_code
像魅力一样工作,显着简化了我的生活.
我正在使用Rails 2.3.10并“修补”boot.rb并根据需要创建了preinitializer.
我的问题是,Rails如何知道我的gem位于shared / bundle目录中,以及它如何知道使用它们?此目录是否以某种方式自动添加到加载路径?这些宝石如何先于系统宝石?
解决方法
jdl,感谢您前往哪里寻找.这是我对发生的事情的理解.
Bundler自动将gem安装到shared / bundle中,如使用Gemfile中的bundle_dir指定的那样,默认为:
# (line 39 bundler/deployment.rb) set :bundle_dir,File.join(fetch(:shared_path),'bundle')
:shared_path来自capistrano
这就是安装宝石的第一步.现在,据我所知,当你指定一个目录来安装gems时,Bundler总是修改根目录中的.bundle / config(即Gemfile所在的位置).这是我在对共享目录进行捆绑安装后的样子:
--- BUNDLE_DISABLE_SHARED_GEMS: "1" BUNDLE_WITHOUT: development:test BUNDLE_FROZEN: "1" BUNDLE_PATH: /mnt/apps/my_app/shared/bundle
然后,(正如jdl所指出的)GEM_HOME基于此.bundle / config进行设置.
bundler.rb中的configure_gem_home_and_path方法设置ENV [‘GEM_HOME’],它基于一些设置,通过一个复杂的进程最终从.bundle / config获取BUNDLE_PATH.
呼…