繁体   English   中英

创建一个扩展另一个 gem 的新 gem:/kernel_require.rb>:85:in `require': cannot load such file -- csv-probe (LoadError)

[英]Creating a new gem which extends another gem: /kernel_require.rb>:85:in `require': cannot load such file -- csv-probe (LoadError)

我正在尝试创建我的第一个 ruby gem。 我使用 bundler bundle gem csv-probe创建了 gem 骨架。 由于 gem 旨在作为csv gem 的扩展,因此我在其名称中使用了连字符而不是下划线,如下所示: https://guides.ZA2B42015BC2D55385451F2F047-531FF5

我构建了 gem 并尝试使用它,但是,当我尝试通过require 'csv-probe'加载 gem 时,出现以下错误:

<internal:/usr/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- csv-probe (LoadError)
    from <internal:/usr/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from ./test.rb:6:in `<main>'

我认为这与捆绑器创建的 lib 目录的嵌套结构有关。

lib
└── csv
    ├── probe
    │   ├── checks.rb
    │   └── version.rb
    └── probe.rb

也许我以错误的方式扩展了 csv 类?
lib/csv/probe.rb文件的内容

# frozen_string_literal: true

require "csv"
require "terminal-table"
require_relative "probe/version"
require_relative "probe/checks"

# Probe provides methods for linting a:
# * CSV::Table
# * CSV::Row
#
# The linting methods:
# * lint_rows takes following arguments
#   * csv_rows: CSV::Table
#   * checks: Array of Probe Checks and
#   * options
# * lint_row takes following arguments
#   * csv_row: CSV::Row
#   * checks: Array of Probe Checks and
#   * optsions
module Probe
  def self.lint_rows(csv_rows, checks, opts = {})
    lineno_start = opts[:headers] ? 2 : 1
    csv_rows.each.with_index(lineno_start) do |row, lineno|
      opts[:lineno] = lineno
      lint_row(row, checks, opts)
    end
  end

  def self.lint_row(csv_row, checks, opts = {})
    unless csv_row.is_a? CSV::Row
      raise Error "lint_row(csv_row,...), csv_row is not of type CSV::Row, but of type '#{csv_row.class}'"
    end

    checks.each do |check|
      check.evaluate(csv_row, opts)
    rescue LintingError => e
      raise e unless opts[:exception] == false

      puts e.message # if exception oppressed, write error out on stdout
    end
  end
end

# Extend CSV::Table with .lint(...) method
class CSV::Table # rubocop:disable Style/ClassAndModuleChildren -> TODO: don't know how to fix this
  def lint(checks, opts = {})
    opts[:headers] = true unless opts.key?(:headers) # CSV::Table has always headers, hence set :headers = true
    Probe.lint_rows(self, checks, opts)
  end
end

# Extend CSV::Row with .lint(...) method
class CSV::Row # rubocop:disable Style/ClassAndModuleChildren
  def lint(checks, opts = {})
    Probe.lint_row(self, checks, opts)
  end
end

我注意到在使用require 'csv/probe'加载 gem 时它可以工作,但是,生成的README.md骨架提到 gem 是通过require 'csv-probe'加载的,所以我想我做错了什么。

可以在此处找到 gem 的源代码:
https://gitlab.com/homebase-dev/csv-probe

如错误消息所述, Ruby 找不到名为csv-probe.rb的文件。

计算机非常擅长寻找东西。 所以,在 99% 的情况下,当计算机告诉你它找不到东西时,原因是你告诉它要找的东西不存在。

所以,第 1 步是检查:名为csv-probe.rb的文件是否真的存在?

在 rest 的案例中,99% 的情况下,您告诉计算机要查找的东西确实存在于某个地方,但在您告诉计算机要查找的地方并不存在,换句话说,您告诉计算机查找正确的东西放错地方了。

因此,如果文件确实存在于某处,则步骤 #2 将检查:文件所在的路径是否位于 Ruby 的$LOAD_PATH

注意 RubyGems 实际上是猴子补丁Kernel#require并且会自动尝试将 Gem 的lib目录添加到$LOAD_PATH 因此,如果该文件存在于某个 Gem 的lib目录中,但当前不在$LOAD_PATH中,那么下一步就是调查为什么该 Gem 的目录没有自动添加到$LOAD_PATH中。

有一个约定,即 Gem 的主入口点应该与 Gem 具有相同的名称,但这只是一个约定。 最著名的不遵循约定的 Gem 之一是activesupport Gem,其主要入口点是active_support.rb

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM