如何在Gemfile中指定本地gem?

pic*_*rdo 346 ruby rubygems ruby-on-rails bundler ruby-on-rails-3

我想要Bundler加载本地gem.那有选择吗?或者我是否必须将gem文件夹移动到.bundle目录中?

Jim*_*dra 520

我相信你可以这样做:

gem "foo", path: "/path/to/foo"
Run Code Online (Sandbox Code Playgroud)

  • 硬编码路径适用于快速黑客会话,但bloudermilk的本地gem解决方案对于受版本控制的项目更有效.它允许您继续检查两个项目 - 使用gem的gem和项目 - 这样其他人就不必检查gem源或共享相同的路径. (10认同)
  • 需要注意的是Spring.如果您使用gem的本地路径,您可能会注意到本地gem的缓存版本,就像我在rails控制台中所做的那样.如果看起来你的本地宝石变化似乎没有被选中,请尝试`spring stop`以确定它是否确实是问题. (5认同)
  • 通过在项目目录中使用.gitignored符号链接到本地​​gem,可以使其更加清晰 - 这样您就可以分别对两个项目使用源代码控制,而其他人可以在没有相同目录结构的情况下执行相同操作. (4认同)
  • 在这里做更好的方式:https://rossta.net/blog/how-to-specify-local-ruby-gems-in-your-gemfile.html (4认同)
  • 如果您要在更大的项目中测试 gem 的本地开发,这是一种非常好的方法。在这种情况下,这是执行此操作的“更好”方法,然后必须推送到存储库以测试本地更改。 (2认同)

blo*_*ilk 220

除了指定路径(如Jimmy所提到的),您还可以通过使用以下配置选项强制Bundler 仅为您的环境使用本地gem :

$ bundle config local.GEM_NAME /path/to/local/git/repository
Run Code Online (Sandbox Code Playgroud)

如果您正在并行开发两个宝石或一个gem和一个rails应用程序,这将非常有用.

但请注意,这仅在您已经使用git作为依赖项时才有效,例如:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack
Run Code Online (Sandbox Code Playgroud)

正如文档中所见.

  • 要禁用本地覆盖:`bundle config --delete local.GEM_NAME` (29认同)
  • 请注意,根据讨论[此处](https://github.com/bundler/bundler/issues/2911),这不适用于**gemspec**. (2认同)
  • 如果你想在生产开发中使用不同的分支,你还必须设置`bundle config disable_local_branch_check true`或Bundler会抱怨分支.但要小心,因为检查应该阻止不正确的提交进入`Gemfile.lock`.文档:http://bundler.io/v1.12/git.html (2认同)

Rim*_*ian 30

如果您正在使用git,也可以使用git引用本地gem.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'
Run Code Online (Sandbox Code Playgroud)

然后,如果它改变了我跑

bundle exec gem uninstall foo
bundle update foo
Run Code Online (Sandbox Code Playgroud)

但我不确定每个人都需要运行这两个步骤.

  • 这很好,但如果你正在积极开发gem,那就不那么方便...因为你需要提交每一个更改&`bundle uninstall <gem> && bundle install`,以便你想要在你的app上反映的每一个更改 (4认同)

got*_*tqn 18

要在Rails项目中使用本地gem存储库,请按照以下步骤操作:

  1. 检查您的gem文件夹是否是git存储库(该命令在gem文件夹中执行)

    git rev-parse --is-inside-work-tree
    
    Run Code Online (Sandbox Code Playgroud)
  2. 获取存储库路径(该命令在gem文件夹中执行)

    git rev-parse --show-toplevel
    
    Run Code Online (Sandbox Code Playgroud)
  3. 为rails应用程序设置本地覆盖

    bundle config local.GEM_NAME /path/to/local/git/repository
    
    Run Code Online (Sandbox Code Playgroud)

    GEM_NAMEgem的名称在哪里,是/path/to/local/git/repository命令的输出2

  4. 在您的应用程序中Gemfile添加以下行:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
    
    Run Code Online (Sandbox Code Playgroud)
  5. 跑步bundle install应该给出这样的东西:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 
    
    Run Code Online (Sandbox Code Playgroud)

    这里GEM_NAME是你的宝石的名称和/path/to/local/git/repository从点2

  6. 最后,运行bundle list,而不是gem list,你应该看到这样的事情:

    GEM_NAME (0.0.1 5a68b88)
    
    Run Code Online (Sandbox Code Playgroud)

    GEM_NAME宝石的名称在哪里


我观察到的几个重要案例:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
Run Code Online (Sandbox Code Playgroud)
  • 似乎RubyMine没有将本地宝石显示为外部库.有关该错误的更多信息可以在这里这里找到
  • 当我在本地gem中更改某些内容时,为了在rails应用程序中加载,我应该stop/start使用rails服务器
  • 如果我要更改versiongem,stopping/startingRails服务器会给我一个错误.为了解决这个问题,我在rails应用程序中指定了gem版本,Gemfile如下所示:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
    
    Run Code Online (Sandbox Code Playgroud)