如何在Gemfile中指定本地gem?


Answers:


539

我相信您可以这样做:

gem "foo", path: "/path/to/foo"

10
硬编码的路径对于快速的hack会话是合适的,但是bloudermilk的本地gem解决方案对于受版本控制的项目更有效。它使您可以继续检入两个项目(gem和使用gem的项目),这样其他人就不必检出gem的来源或共享相同的路径。
mahemoff 2014年

4
您可以通过使用.gitignored符号链接到项目目录中的本地gem来使此操作更加简洁-这样,您可以在两个项目上分别使用源代码管理,而其他项目可以在没有相同目录结构的情况下执行相同的操作。
2015年

6
需要注意的可能是Spring。如果您为宝石使用本地路径,则可能会像我在Rails控制台中那样注意到本地宝石的缓存版本。如果看起来您当地的宝石更换没有被发现spring stop,请尝试看是否确实是问题所在。
杰森R

1
将本地gem路径添加到config / spring.rb似乎有助于重新启动Rails控制台/服务器后实现本地gem更改。
杰森R

4
在这里做的更好的方法:rossta.net/blog/…–
Cyzanfar

229

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

$ bundle config local.GEM_NAME /path/to/local/git/repository

如果要同时开发两个gem或一个gem和rails应用程序,这将非常有用。

但是请注意,这仅在您已经将git用于依赖项时才有效,例如:

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

# In your terminal
$ bundle config local.rack ~/Work/git/rack

正如在文档中所见。


我对此有疑问,因为我正在使用BUNDLE_PATH(构建用于分发的程序包)。在执行您提出的建议或吉米的答案时,它只会执行using,而不会实际安装到我的BUNDLE_PATH文件夹中。我无法弄清楚,有什么帮助吗?
Automatico

2
请注意,根据此处的讨论,这不适用于gemspec
davetapley14年

31
禁用本地替代:bundle config --delete local.GEM_NAME
alxndr 2014年

我必须从gem行中删除版本指令才能使其正常工作。
Epigene '16

4
如果您想在生产中使用不同的分支,则还必须进行设置,bundle config disable_local_branch_check true否则Bundler会抱怨该分支。不过请务必谨慎,因为检查应该阻止不正确的提交进入Gemfile.lock。Docs here:bundler.io/v1.12/git.html
Leo,

33

如果碰巧正在使用它,也可以使用git引用本地gem。

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

然后,如果它改变了,我运行

bundle exec gem uninstall foo
bundle update foo

但是我不确定每个人都需要执行这两个步骤。


5
这很棒,但是如果您正在积极开发gem的话就不那么方便了……因为您需要提交所有更改&bundle uninstall <gem> && bundle install ,对于要反映在应用程序中的每个更改
Ramses

18

为了在Rails项目中使用本地gem仓库,请遵循以下步骤:

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

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

    git rev-parse --show-toplevel
  3. 为Rails应用程序设置本地替代

    bundle config local.GEM_NAME /path/to/local/git/repository

    GEM_NAME您的gem的名称在哪里,是该/path/to/local/git/repository点的命令输出2

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

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. 跑步bundle install应该给这样的东西:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    GEM_NAME您的宝石的名称在哪里,/path/to/local/git/repository从哪里开始2

  6. 最后,运行bundle list,而不是gem list,您应该看到类似以下内容:

    GEM_NAME (0.0.1 5a68b88)

    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
  • 似乎RubyMine没有将本地宝石显示为外部库。有关该错误的更多信息,请参见 此处此处。
  • 当我在本地gem中更改某些内容时,为了将其加载到rails应用程序中,我应该stop/start使用rails服务器
  • 如果我更改了versiongem,stopping/starting则Rails服务器会给我一个错误。为了修复它,我在rails应用程序中指定了gem版本,Gemfile如下所示:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'


-4

如果您也想要分支:

gem 'foo', path: "point/to/your/path", branch: "branch-name"

这行不通,并产生错误: Only gems with a git source can specify a branch.
KenB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.