如何在我的 Gemfile 中指定本地 gem?
Posted
技术标签:
【中文标题】如何在我的 Gemfile 中指定本地 gem?【英文标题】:How can I specify a local gem in my Gemfile? 【发布时间】:2011-05-28 03:22:23 【问题描述】:我希望 Bundler 加载本地 gem。有选择吗?还是我必须将 gem 文件夹移动到 .bundle 目录中?
【问题讨论】:
【参考方案1】:您可以参考 gem 的来源:
source: 'https://source.com', git repository (:github => 'git/url')
并带有本地路径
:path => '.../path/gem_name'
.
您可以了解更多关于 [Gemfiles 以及如何使用它们] (https://kolosek.com/rails-bundle-install-and-gemfile) 在这篇文章中。
【讨论】:
【参考方案2】:我相信你可以做到:
gem "foo", path: "/path/to/foo"
【讨论】:
硬编码路径适合快速破解会话,但 bloudermilk 的本地 gem 解决方案对于版本控制下的项目更有效。它使您可以继续检查两个项目 - gem 和使用 gem 的项目 - 这样其他人就不必检查 gem 源或共享相同的路径。 您可以通过在项目目录中使用指向本地 gem 的 .gitignored 符号链接来使其更简洁——这样您就可以在两个项目上分别使用源代码控制,而其他人可以在没有相同的目录结构。 需要注意的可能是春天。如果您为 gem 使用本地路径,您可能会注意到本地 gem 的缓存版本,就像我在 rails 控制台中所做的那样。如果您的本地 gem 更改似乎没有被采纳,请尝试spring stop
看看是否确实是问题所在。
这里有更好的方法:rossta.net/blog/…
如果您在一个较大的项目中测试本地开发的 gem,这是一个非常好的方法。在这种情况下,这是执行此操作的“更好”方法,然后必须推送到存储库以测试本地更改。【参考方案3】:
除了指定路径(正如 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
如在the docs 上看到的那样。
【讨论】:
我遇到了这个问题,因为我正在使用BUNDLE_PATH
(构建一个分发包)。在执行您的建议或 Jimmy 的回答时,它只执行 using
,而不是实际安装到我的 BUNDLE_PATH
文件夹中。我无法弄清楚这一点,有什么帮助吗?
请注意,这不适用于 gemspec,根据讨论 here。
禁用本地覆盖:bundle config --delete local.GEM_NAME
我必须从 gem 行中删除版本指令才能使其正常工作。
如果您想在开发中使用与生产不同的分支,您还必须设置 bundle config disable_local_branch_check true
否则 Bundler 会抱怨该分支。不过要小心这一点,因为检查应该阻止不正确的提交进入Gemfile.lock
。这里的文档:bundler.io/v1.12/git.html【参考方案4】:
要在 Rails 项目中使用本地 gem 存储库,请按照以下步骤操作:
检查你的gem文件夹是否是git仓库(命令在gem文件夹中执行)
git rev-parse --is-inside-work-tree
获取仓库路径(命令在gem文件夹中执行)
git rev-parse --show-toplevel
为 Rails 应用程序设置本地覆盖
bundle config local.GEM_NAME /path/to/local/git/repository
其中GEM_NAME
是您的gem 的名称,/path/to/local/git/repository
是点2
中命令的输出
在您的应用程序Gemfile
中添加以下行:
gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
运行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
是您的 gem 的名称,/path/to/local/git/repository
从点 2
开始
最后,运行bundle list
,而不是gem list
,你应该会看到如下内容:
GEM_NAME (0.0.1 5a68b88)
GEM_NAME
是您的 gem 的名称
我观察到的几个重要案例:
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 显示为外部库。有关该错误的更多信息可以找到here 和here
当我在本地 gem 中更改某些内容时,为了加载到 rails 应用程序中,我应该 stop/start
rails 服务器
如果我要更改 gem 的 version
,Rails 服务器的 stopping/starting
会给我一个错误。为了修复它,我在 rails 应用程序 Gemfile
中指定 gem 版本,如下所示:
gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
【讨论】:
【参考方案5】:如果你也想要分支:
gem 'foo', path: "point/to/your/path", branch: "branch-name"
【讨论】:
这不起作用,会产生错误:Only gems with a git source can specify a branch.
【参考方案6】:
如果您碰巧正在使用它,也可以使用 git 引用本地 gem。
gem 'foo',
:git => '/Path/to/local/git/repo',
:branch => 'my-feature-branch'
然后,如果它发生变化,我会运行
bundle exec gem uninstall foo
bundle update foo
但我不确定每个人都需要运行这两个步骤。
【讨论】:
这很好,但如果您正在积极开发 gem,那就不太方便了...因为您需要提交每个更改和bundle uninstall <gem> && bundle install
,对于您希望反映在您的应用以上是关于如何在我的 Gemfile 中指定本地 gem?的主要内容,如果未能解决你的问题,请参考以下文章
在 Gemfile 中指定 rubygem 时 ~> 和 >= 有啥区别?
在开发过程中如何配置 Bundler/Gemfile 以使用不同的 gem 源?
bundle update --conservative devise 不只更新“设计”gem
如果 gem 源指定为 git,则 ActiveMerchant ActionView 帮助程序初始化崩溃,但如果它是默认路径或本地路径则有效