1

バンドル、ビルド、配布、実装に関して問題なく機能しているカスタムgemがあります。gemは、他のgemが派生するフレームワークのコアです。ほとんどの派生gemは同じ基本構造を持つためbin、gemのパスにRubyスクリプトを含めます。このスクリプトを使用して、基本的にフォルダーからtemplateユーザーが独自のgemを開発する新しいフォルダーにファイルをコピーできます。

私が抱えている問題は、フォルダに、ファイル内に同じ名前のクラス/モジュールで名前がtemplate付けられたgemspecファイル(例:)があり、がユーザーによって指定された名前に置き換えられることです。$name$.gemspecmodule $Name$$name$

残念ながら、bundle installgemの最上位パスから実行すると、エラーが発生します。

There was a SyntaxError while evaluating $name$.gemspec:
C:/my_gem/template/$name$.gemspec:8: syntax error, unexpected tGVAR
  gem.version = MyGem::$Name$::VERSION

次のいずれかを介してGemfileまたはパスを明示的に渡した場合でも、Bundlerが間違ったGemfileを使用しているようです。

bundle install --gemfile=Gemfile
bundle install --path=C:\my_gem

gemspecまた、Gemfileの行を無駄に更新しようとしました。

gemspec name: 'my_gem'

最後に、templateフォルダがに含まれていないことを確認しましmy_gem.gemspecたが、それは問題ではないようです。

gem.files = Dir.glob("lib/**/*") + %w(LICENSE.txt README.md)

./template/$name$.gemspecBundlerが代わりに読み込もうとしている理由を誰かが知っています./my_gem.gemspecか?

4

1 に答える 1

2

Bundlerソースを調べたところ、lib / bundler / source/path.rbで原因を見つけた可能性があります。でgemspecを検索するために使用されるGLOBがありload_spec_filesます。デフォルトのグロブはです"{,*,*/*}.gemspec"。これにより、gemのルートディレクトリまたはルートから1つ下のディレクトリ(テンプレートディレクトリが含まれる)に*.gemspecが見つかります。

これが実際に原因である場合は、テンプレートディレクトリをgemのdir階層のより深い位置に配置するか、テンプレートファイルの名前をで終わらないように変更することでこれを回避できます.gemspecBundler::Source::Pathオブジェクトは初期化時に別のグロブを取ることができるように見えますが、configまたはcmdlineオプションを使用してバンドル実行でこの代替グロブを指定する実行可能な方法があるかどうかを確認するのに十分な深さを掘り下げていません。

于 2012-12-10T21:45:33.880 に答える