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

Posted

技术标签:

【中文标题】如何在我的 Gemfile 中指定本地 .gem 文件?【英文标题】:How do I specify local .gem files in my Gemfile? 【发布时间】:2011-08-03 18:51:37 【问题描述】:

我有几个通过gem install xx.gem 安装的gem 文件。我可以告诉 Bundler 使用它们吗?还是我必须指定源路径?

【问题讨论】:

相关:***.com/questions/4487948/… 【参考方案1】:

这并不是对您关于安装 .gem 软件包的问题的严格回答,但您可以通过编辑您的 Gemfile 逐个宝石地指定各种位置。

指定 :path 属性将从该路径安装 gem 到您的本地机器上。

gem "foreman", path: "/Users/pje/my_foreman_fork"

另外,指定 :git 属性将从远程 git 存储库安装 gem。

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

(正如his comment中提到的@JHurrah。)

【讨论】:

对于某些防火墙来说,git 协议也可能是个问题。在这种情况下尝试gem "foreman", :git => "https://github.com/pje/foreman.git"【参考方案2】:

似乎捆绑程序无法使用 .gem 文件开箱即用。将 :path 指向包含 .gem 文件的目录不起作用。有人建议为此设置本地 gem 服务器(geminabox、stickler)。

但是,我发现更简单的是使用文件系统中的本地 gem“服务器”: 只需将您的 .gem 文件放在本地目录中,然后使用“gem generate_index”使其成为 Gem 存储库

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

通过将以下行添加到您的 Gemfile 中,最后将 bundler 指向该位置

source "file://path/to/repo"

如果您更新存储库中的 gem,请确保重新生成索引。

【讨论】:

谢谢!另外,我需要第三个斜杠来执行“file:///Absolute/Path/to/repo” 在命令行上运行“gem server”并将源“localhost:8808”添加到您的 Gemfile 会不会更容易 额外提示:您可以像这样使用 File.expand_path source "file://#File.expand_path('.')/chef-11.10.0.dev.2" 来绕过绝对路径要求 @Nakilon 我遇到了同样的问题,但后来意识到我没有将我的 gem 放入 repo 文件夹的 gems 文件夹中,而只是放入 repo 文件夹中。您是否创建了gems 文件夹? 超级绝招!这是一个小的补充。如何验证 gems 现在在本地可用:gem list -r --clear-sources -s file:/repo【参考方案3】:

我会在应用程序供应商文件夹中解压你的 gem

gem unpack your.gem --target /path_to_app/vendor/gems/

然后在 Gemfile 上添加路径以链接解压后的 gem。

gem 'your', '2.0.1', :path => 'vendor/gems/your'

【讨论】:

【参考方案4】:

默认情况下,Bundler 将首先检查您的系统,如果找不到 gem,它将使用 Gemfile 中指定的源。

【讨论】:

是的。但是如果我以前没有安装过呢?(当我部署到服务器时)在任何完成的源命令中都找不到 Imlib2-Ruby-0.5.2 你可以用 gem "gemname", :path => "~/some/local/path" 指向一个本地目录 我认为 :path 需要 gem 文件夹和 gemspec 文件。我只有想要安装的 .gem 文件。 好的所以 cap 部署通过了,但是 gem 没有安装 "没有这样的文件要加载 -- vips" :/ 这绝对不是真的,至少不再是这样了。 Bundler查看您的系统 gem,只查看 Gemfile 中的内容。它如此可怕的原因之一。【参考方案5】:

您可以通过“bundle package”和“bundle install --local”强制捆绑器使用您部署的 gems

在您的开发机器上:

bundle install

(安装所需的 gem 并生成 Gemfile.lock)

bundle package

(缓存供应商/缓存中的宝石)

在服务器上:

bundle install --local

(--local 表示“使用来自供应商/缓存的 gem”)

【讨论】:

如果我无法在服务器上安装任何东西怎么办?在这种情况下,我需要使用 rake 构建,但服务器没有用于构建的 gem;但我在检查依赖项时没有问题。 如果 gem 未包含在我现有的 Gemfile“源”中,“bundle install”对我不起作用。 在做bundle install之前先把gem文件暂时从gem文件中删除,然后把gemfile复制到vendor/cache,再把gem添加回gemfile并执行bundle install --local bundle package 是一个很好的建议,即使是现在,三年后。如果您的 Bundler 版本早于 2.0(在撰写本文时尚未发布),如果您想包含具有 pathgit 依赖项的 gem,则需要使用 bundle package --all。不过,如果它检测到此类依赖项,它会给您一个有用的提醒。 仅供参考:如果您在与部署不同的平台上开发(例如在 macOS 上开发,部署到 Linux),这可能不会像您希望的那样工作。根据 --local 文档:“请注意,如果 ruby​​gems.org 上存在适当的特定于平台的 gem,它将找不到。”【参考方案6】:

.gem 添加到vendor/cache 似乎有效。 Gemfile 中不需要任何选项。

【讨论】:

【参考方案7】:

我发现使用 geminabox 运行我自己的 gem 服务器最简单

见these simple instructions。

【讨论】:

以上是关于如何在我的 Gemfile 中指定本地 .gem 文件?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在我的 Gemfile 中指定确切的版本吗?

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

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

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

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

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