ruby - 当使用可执行二进制文件开发 gem 时,无法要求存在于 lib 目录中的文件

标签 ruby rubygems

我正在开发一个名为 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/

相关文章:

ruby - CSV 导入 : undefined method `path'

ruby-on-rails - 安装 contrib 包后 pg_search dmetaphone 不工作

ruby - 在 Linux Mint 中安装 gstreamer gem 时遇到问题

css - 如何使用 compass 和 scss 要求混合(来自配置)

ruby - 编写一个简单的 IRC(互联网中继聊天)客户端

ruby - 在rails应用程序中生成pdf时如何用Prawn定义行高?

ruby - 二级数组排序,其中一个二级数​​组成员始终在顶部

ruby - Ruby 中是否有 nvl() 函数,还是我必须自己编写?

ruby - 无法在 Linux 上安装 jekyll gem(classifier-reborn ruby​​ 版本错误)

RubyGem 下载量似乎人为地高。是否有从 RubyGems.org 下载的机器人?