ChatGPT解决这个技术问题 Extra ChatGPT

如何在我的 Gemfile 中指定本地 gem?

我希望 Bundler 加载本地 gem。有选择吗?还是我必须将 gem 文件夹移动到 .bundle 目录中?


I
Iulian Onofrei

我相信你可以做到这一点:

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

硬编码路径非常适合快速 hack 会话,但 bloudermilk 的本地 gem 解决方案对于版本控制下的项目更有效。它使您可以继续检查两个项目——gem 和使用 gem 的项目——这样其他人就不必检查 gem 源或共享相同的路径。
您可以通过在项目目录中使用指向本地 gem 的 .gitignored 符号链接来使其更加简洁——这样您就可以在两个项目上分别使用源代码控制,而其他项目也可以在没有相同目录结构的情况下执行相同的操作。
需要注意的可能是春天。如果您为 gem 使用本地路径,您可能会注意到本地 gem 的缓存版本,就像我在 rails 控制台中所做的那样。如果您的本地 gem 更改似乎没有被提取,请尝试 spring stop 以查看是否确实是问题所在。
在此处执行此操作的更好方法:rossta.net/blog/…
如果您在大型项目中测试 gem 的本地开发,这是一种非常好的方法。在这种情况下,这是执行此操作的“更好”方法,然后必须推送到存储库以测试本地更改。
s
sibo

除了指定路径(如 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 文件夹中。我无法弄清楚这一点,有什么帮助吗?
请注意,根据讨论here,这不适用于 gemspec
要禁用本地覆盖:bundle config --delete local.GEM_NAME
我必须从 gem 行中删除版本指令才能使其正常工作。
如果您想在开发中使用与生产不同的分支,您还必须设置 bundle config disable_local_branch_check true 否则 Bundler 会抱怨该分支。不过要小心这一点,因为检查应该阻止不正确的提交进入 Gemfile.lock。此处的文档:bundler.io/v1.12/git.html
R
Rimian

如果您碰巧正在使用它,您还可以使用 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 ,对于您希望反映在应用程序上的每项更改
M
Michael Mior

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

检查你的gem文件夹是否为git仓库(命令在gem文件夹中执行) git rev-parse --is-inside-work-tree 获取仓库路径(命令在gem文件夹中执行) git rev-parse - -show-toplevel 为 Rails 应用程序包设置本地覆盖 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' Running bundle install 应该给出如下内容: Using GEM_NAME (0.0 .1) 来自 git://github.com/GEM_NAME/GEM_NAME.git (位于 /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 显示为外部库。可以在此处和此处找到有关该错误的更多信息

当我在本地 gem 中更改某些内容时,为了加载到 rails 应用程序中,我应该停止/启动 rails 服务器

如果我要更改 gem 的版本,停止/启动 Rails 服务器会给我一个错误。为了修复它,我在 Rails 应用程序 Gemfile 中指定 gem 版本,如下所示: gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'


N
Nesha Zoric

您可以使用源代码引用 gem:

source: 'https://source.com', git repository (:github => 'git/url') 和本地路径

:path => '.../path/gem_name'

您可以在本文中了解有关 [Gemfile 及其使用方法] (https://kolosek.com/rails-bundle-install-and-gemfile) 的更多信息。


C
C Johnson

如果你也想要分支:

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

这不起作用,会产生错误:Only gems with a git source can specify a branch.