【问题标题】:Bundler unable to find custom gemBundler 找不到自定义 gem
【发布时间】:2023-03-04 04:57:01
【问题描述】:

我有一个构建为 .gem 文件的自定义 gem,我试图从我的 Gemfile 中引用它。我已将 .gem 文件与 .gemspec 一起放在 vendor/gems 文件夹中。我的 Gemfile 有以下行:

gem 'umlgrader', '1.0.0', :path=>'vendor/gems'

当我运行 bundle install 时,它声称找到了 gem,但它说它正在“使用”gem,而不是“安装”它,即使 gem 以前没有安装在我的机器上。当我尝试运行我的应用程序时,当它尝试调用 gem 中的任何方法时,我会收到 NoMethodError。为什么 Bundler 不安装 gem?

我已经通过在该目录中解压缩 gem 然后编辑 Gemfile 来使其工作,如下所示:

gem 'umlgrader', '1.0.0', :path=>'vendor/gems/umlgrader-1.0.0'

此解决方案不太理想。我希望能够使用 Bundler 安装 gem,因为我正在尝试将应用程序部署到 Heroku。我已经尝试了很多我在网上找到的解决方案,但我愿意接受任何建议。

编辑: 我已经浏览过并尝试过的其他一些页面: Bundler: installing a specific .gem file How to use Bundler with offline .gem file? How do I specify local .gem files in my Gemfile?

我还注意到很多人建议指向包含 gem 的 Git 存储库。如果没有必要,我宁愿不这样做。

【问题讨论】:

  • 您能否添加一些您尝试过的解决方案的链接?这样我们就可以避免推荐相同的东西。
  • 我已经阅读了很多在 Gemfile 中使用 :path 的解决方案,他们都声称它可以正常工作,但显然不行。我也尝试过使用 bundle 包并将所有 gem 放在 vendor/cache 中,这在本地工作,但在我部署到 Heroku 时不能。

标签: ruby-on-rails bundler


【解决方案1】:

没有 Docker

您需要将存储库从 github(或其他来源)克隆到您的自定义文件夹。在下面的示例中,重现我如何使用自定义路径在单独的文件夹中编辑 gem 的步骤:

  1. 在这种情况下,我使用 /bundle 内的 custom_gems 文件夹:mkdir /bundle/custom_gems
  2. cd /bundle/custom_gems
  3. git clone <gem-repository-source>。必须克隆,因为如果您从计算机中的其他文件夹复制,可能会丢失一些文件。
  4. 在您的Gemfile中设置:gem '<gem-name>', path: '/bundle/custom_gems/<gem-name>'
  5. 重新启动您的应用程序。

在 docker-compose(或 Docker)中

  1. 与 docker 略有不同,在这种情况下,我在 my rails 应用程序文件夹中使用 /gems 文件夹:mkdir <my-app>/gems
  2. cd <my-app>/gems
  3. git clone <gem-repository-source>。必须克隆,因为如果您从计算机中的其他文件夹复制,可能会丢失一些文件。
  4. 在您的 Gemfile 中设置:gem '<gem-name>', path: '/bundle/custom_gems/<gem-name>'
  5. 如果您使用 docker-compose,则需要使用 volumes 配置绑定文件夹,如下所示:
volumes:
    - ./app/gems:/bundle/custom_gems

这样,您的本地文件夹(您的机器)将 ./app/gems 中的文件复制到 Docker 容器中的 /bundle/custom_gems

  1. 重启服务。

如果您使用 docker-compose,则需要在 Dockerfile 中添加如下内容: ADD ./app/gems /bundle/custom_gems

【讨论】:

    【解决方案2】:

    Bundler 文档在该主题上有些神秘,但这是 Bundler 的预期行为。要使用 path 选项,您必须在所需位置解压缩 gem。

    但这对 Heroku 来说应该没问题。毕竟,即使 gem 已经解包,您仍在使用 Bundler。只是gem安装过程少了一步...

    【讨论】:

    • 它有效,只是对我们来说意义不大。我们继承了这个项目,带有一个超级怪异的目录结构,其中作为 gem 一部分的代码位于根级别,而 Web 项目位于其中。因此,从整体上查看我们的存储库时,我们将通过在 Web 项目中解压缩代码来复制代码。
    • 有没有办法让它在不使用 :path 的情况下与 .gem 文件一起使用?当我不使用路径时,Bundler 根本找不到 gem。
    猜你喜欢
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2011-09-06
    相关资源
    最近更新 更多