如何为Rails3/Bundler提供宝石供应商

tro*_*skn 47 ruby-on-rails bundler ruby-on-rails-3

在Rails 2.X中,我可以简单地将gems复制到vendor/gems/gem_name或使用rake命令rake gems:unpack.由于Rails3使用了bundler,它似乎不再起作用了.我找到了命令bundle package,但它的工作方式不同.

编辑:

所以,只是详细说明一下:

该轨道2的工作方式,我可以很容易地用grep找东西在vendor/gems.如果它们捆绑在.gem文件中,那是不可能的.此外,在开发gem /插件时,将它放在rails应用程序中以在上下文中测试它是非常有帮助的.我怎么用bundler/rails3做这些事情?我的工作流程本质上是以某种方式破坏的吗?

oma*_*oma 107

回答问题的第二部分,开发一个插件/ gem并使用rails app运送它而不公开gem,你可以这样做

的Gemfile

gem 'my_private_gem', :path => "vendor/gems/my_private_gem-VERSION"
Run Code Online (Sandbox Code Playgroud)

假设你表演了一个 gem unpack my_private_gem --target vendor/gems

注意:bundle package解包所有gem(与Gemfile.lock一样多).我不希望那些在git中.

  • 我必须为bundler包含gem版本号以在给定路径中找到gem.gem'my_private_gem','1.2.3',:path =>"vendor/gems/my_private_gem-VERSION" (17认同)
  • 这对我有用'gem unpack my_private_gem --target vendor/gems --spec`但它把gem spec放在当前目录而不是目标!那么`mv my_private_gem.gemspec vendor/gems`现在捆绑商不会抱怨宝石版. (3认同)

Joh*_*ley 27

所述捆绑相当于 bundle package.它打包Gemfile中指定的所有.gem文件,vendor/cache以便将来的安装从这个缓存而不是http://rubygems.org/获取宝石.


Mat*_*len 22

正确的Bundler等价物是bundle install --deployment.这将安装处于未解包状态的宝石vendor/bundle.


jse*_*ars 5

这对我有用:

gem unpack <GEM_NAME> [-v <VERSION>] --target vendor/gems
gem specification <GEM_NAME> [-v <VERSION>] --ruby > vendor/gems/<GEM_NAME>[-<VERSION>].gemspec
Run Code Online (Sandbox Code Playgroud)

例如:

gem unpack sidekiq-pro -v 2.1.4 --target vendor/gems
gem specification sidekiq-pro -v 2.1.4 --ruby > vendor/gems/sidekiq-pro-2.1.4.gemspec
Run Code Online (Sandbox Code Playgroud)

第一个命令将gem解压缩到vendor/gems目录中.但是,这不包含gemspec.第二个命令创建关联的gemspec.值得注意的是,另一张海报提到了类似的东西.此解决方案正确地以ruby格式而不是yaml格式编写gemspec.

然后,您可以更新您的Gemfile以指向vendored gem:

gem '<GEM_NAME>', '<VERSION>', :path => "vendor/gems/<GEM_NAME>-<VERSION>"
Run Code Online (Sandbox Code Playgroud)

例如:

gem 'sidekiq-pro', '2.1.4', :path => "vendor/gems/sidekiq-pro-2.1.4"
Run Code Online (Sandbox Code Playgroud)