![](/img/trans.png)
[英]RSpec: kernel_require.rb:45:in `require': cannot load such file — bowling.rb (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.