如何将Gems冻结到Rails 3应用程序中?

nev*_*ame 17 rubygems ruby-on-rails bundler ruby-on-rails-3

我想将特定的gem冻结到我的Rails应用程序中.

在rails 2中有这个命令:

rake gems:unpack
Run Code Online (Sandbox Code Playgroud)

我在Rails 3中找不到该命令.

Mat*_*ght 21

所以,简短的回答是,你没有.

当您修改Gemfile,然后运行bundle install或者bundle update,bundler会为您处理依赖项解析并确定您需要的每个gem的最佳(最新)版本,以满足整个依赖关系链(您不会得到一个新版本,依赖列表中的另一个gem等).您当然也可以使用日常熟悉的语法在Gemfile中放置特定版本或"> = 1.2.3"规范或者什么config.gem,捆绑器也一定要满足(或者不会生成Gemfile.lock如果没有有效的解决方案).

当Bundler开展业务时,它会创建Gemfile.lock文件,这个文件(并且只使用Bundler来管理所有工作站/环境/部署中的gem)执行与冻结所需的所有gem相同的功能.免费!(将此文件检入版本控制!)如果您的新开发实习生在新机器上拉下您的源,它需要一个,bundle install并且您安装的宝石的完全相同版本在她的机器上.推送到部署,并在bundle install --deployment那里(或更有可能,将其丢入您的Capfile),并安装相同的宝石(这次是到供应商/捆绑,可配置).在Rails 3中使用Bundler来管理所有宝石的加载,所以无论你告诉捆绑商安装它们(无论你的正常gem install位置是默认的,或者BUNDLE_PATH(如果你另外安装,则记录在.bundle/config中bundle install --path=foo),捆绑器将加载正确的,即使它们与系统宝石不同.

你不需要解压缩宝石并将它们检入你的应用程序,因为它无关紧要:你保证不管它们安装在哪里都会调用相同的版本,这可能因机器而异(.bundle /不应该检入回购) - 那么为什么要将另外60-80 MB的文件粘贴到你的回购中,你永远不会改变或使用?(顺便说一句,这就是为什么我不推荐bundle install --path=vendor/gems 像nfm建议的那样 - 它不一定是错的,它在普通的捆绑工作流程上没有任何好处,现在你的仓库规模只是膨胀了).

  • 这里的一个重要问题是应用程序使用的上下文非常重要.部署所处的环境可能会受到限制 - 可能不支持捆绑安装.在Site5共享虚拟主机上,由于RubyGems的内存问题,你无法安装宝石......在这种情况下,存储到SVN/Git是一个不好的方法. (2认同)

orb*_*ven 18

不要使用NFM的"推荐"答案!

相反,请查看Bundler站点,尤其是部署页面:http: //gembundler.com/deploying.html

简短的总结是在Gemfile中使用特定版本,并bundle install --deployment在需要确切gem版本的每个目标系统上运行.

使用该--path选项将安装宝石,但它并不是你想要做的.正如Matt Enright所说的那样,你只需要使用捆绑器可以在每个目标环境中智能处理的东西使你的SCM膨胀.


nfm*_*nfm 8

我还没有这么做,但我相信这一切都是由处理的bundler.

当您创建一个新的rails3应用程序时,rails依赖项将被放入您的应用程序中Gemfile.您可以运行bundle install以安装它们.默认情况下,它们会安装到您的BUNDLE_PATH.

如果要在应用程序中安装它们,可以指定以下位置:bundle install vendor/gems.

  • 您还可以运行"bundle pacK",它们最终会出现在"vendor/cache /"目录中. (2认同)

小智 7

我不得不为Heroku上的typus gem部署做这个,因为你不能heroku rails generate typus在Heroku上运行它,因为它是一个只读文件系统.我不希望所有的宝石都放进我的应用程序,只是那个让我感到悲痛的宝石.以下是导致成功的步骤:

  1. 在app_name/vendor/gems/gem_name中创建目录(可选)...在我的案例中/ app_name/vendor/gems/typus

  2. 将以下内容添加到gemfile(这告诉bundle在哪里找到并放置gem源):

    gem'tyxus',:git =>'https://github.com/fesplugas/typus.git',:path =>"vendor/gems/typus"

  3. 然后从你的app目录中(这将gem安装到你的应用程序中):

    'gem unpack typus --target vendor/gems/typus'

  4. 然后 bundle install

  5. 那么..在我的情况下...提交并推送到存储库,然后部署到heroku ...你可能必须运行一个 heroku rake db:migrate