0

カスタム gem を作成した後、含まれるモジュールで定義された関数を参照したいと思います。

カスタム gem はdsi_core、モジュールlib/cuke.rbには単純に次のものが含まれます。

module DsiCore
    module Cuke
        def self.Features(*args)
            puts "Hello world!"
        end
    end
end

宝石をインストールしましたが、/var/lib/gems/1.8/gems/dsi_core-0.1.0/lib/cuke.rb存在するはずです。

別の宝石dsi_fabricにはコードがありますdsi_fabric/lib/dsi_fabric

require 'dsi_core'
# ...
DsiCore::Cuke.Features(*ARGV)

これをgemのlib/ディレクトリから実行しようとしています:dsi_fabric

ruby -rubygems ./dsi_fabric.rb arg1 arg2

..結果:

./dsi_fabric.rb:7: uninitialized constant DsiCore::Cuke (NameError)

Cuke.Featuresこれは の行を指しdsi_fabric.rbます。

私は何を間違っていますか?

4

3 に答える 3

1

'cuke'の代わりに'dsi_core'が必要です。に変更require 'dsi_core'してみてくださいrequire 'cuke'

于 2012-12-10T14:53:38.983 に答える
0

Gem のインポートがどのように機能するかを誤解していました。

gem を作成し、gemspec で他の gem 依存関係を追加すると、それらの依存関係は自動的に既にインポートされます。

したがって、上記の内容は間違っています。gem から gemにcuke.rbファイルをインポートするには、次のようにします。dsi_coredsi_fabric

require 'cuke'

つまり、require dsi_coreGem 仕様と gemspec の性質上、暗黙的です。

次に、コードで参照するには

DsiCore::Cuke

..私が最初に投稿したように。

多くの公開された宝石がrequireフォームで使用する必要があることを示しているため、私は混乱しました:

require `gem-name/module-or-class`.

ただし、これは誤解を招く可能性があります。gem 名はまったく使用されておらず、gem にちなんで名付けられたディレクトリが使用されています。

require 'dir-name/module-or-class'

この例では、gemgem-nameのディレクトリ構造は次のとおりです。

lib/gem-name/module-or-class.rb

lib/つまり、gem 自体にちなんで名付けられたフォルダを gem のディレクトリに作成しました。

于 2012-12-10T15:13:19.063 に答える
0

既存の名前空間でテストしている場合、問題は名前空間になる可能性があるため、ルート名前空間の参照を試してください。

::DsiCore::Cuke.Features(*ARGS)

また、私がコメントで述べたように、あなたが置く必要があります

def self.Features(*args)
  # ...
end

Hehe私はその大文字のメソッド名の注釈が好きではありませんが、それぞれ独自のものです:)

編集

また、試してみてください

require 'rubygems'
require 'dsi_core'
于 2012-12-10T15:04:18.933 に答える