如何在我的 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 中指定确切的版本吗?

在 Gemfile 中指定 ruby​​gem 时 ~> 和 >= 有啥区别?

如何在我的 Gemfile 中找到未使用的宝石

在开发过程中如何配置 Bundler/Gemfile 以使用不同的 gem 源?

bundle update --conservative devise 不只更新“设计”gem

如果 gem 源指定为 git,则 ActiveMerchant ActionView 帮助程序初始化崩溃,但如果它是默认路径或本地路径则有效