我正在开发一个名为 I19
的 gem。它应该有一个 CLI。所以在 bin/i19
中,我 需要“i19”
。
从文件 lib/i19.rb
中,我确实需要放置在 lib/i19/
中的文件。
如果我执行 bundle console
一切正常,但是当我尝试执行二进制文件时(我正在执行 rake install; i19 help
)我得到这个错误: require':无法加载此类文件 -- i19/scanners/pattern_scanner (LoadError)
这是我的文件的样子:
# bin/i19
#!/usr/bin/env ruby
require "thor"
require "i19"
module I19
class CLI < Thor
end
end
I19::CLI.start
# lib/i19.rb
require "i19/version"
require "i19/commands"
require "i19/scanners/pattern_scanner"
require "i19/scanners/pattern_with_scope_scanner"
module I19
end
# lib/scanners/pattern_scanner.rb
require 'i19/scanners/base_scanner'
module I19::Scanners
class PatternScanner < BaseScanner
# ...
end
end
我不明白为什么它可以从控制台运行,但不能从命令行运行。
最佳答案
好的,我自己找到了答案。问题不在于 ruby 代码,而在于 gem 的编译方式。
我的 gemspec
文件如下所示
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'i19/version'
Gem::Specification.new do |spec|
# ...
spec.files = `git ls-files`.split($/)
# ...
end
问题是 git ls-files
没有列出未跟踪的文件。一旦我执行了 git add lib/i19/scanners/pattern_scanner.rb
它就成功了。
这让我觉得我手动测试 CLI 的工作流程可能不是最好的,即 rake install; i19 更新
。有没有更好的办法?
关于ruby - 当使用可执行二进制文件开发 gem 时,无法要求存在于 lib 目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296510/