2016-03-07 7 views
6

Wir haben a gem, die über eine Rake-Task ausgeführt wird. Die Aufgabe ist in lib/tasks/<namespace>.rake definiert. Nach dem Lesen von Rake tasks inside gem not being found habe ich bestätigt, dass die .gemspec die Datei enthält, die die Aufgabe definiert; Es gibt auch a railtie which should be including the tasks wie in including rake tasks in gems vorgeschlagen. Und dennoch scheint unsere Rails 4.1-Anwendung die Rake-Task nicht zu laden.Warum fügt dieses Juwel keine Rake-Aufgaben zu einer Rails-App hinzu?

Was fehlt mir?

Antwort

3

Das Problem war nicht mit dem Juwel, aber mit der Art, wie es in der App enthalten war.

Im Gemfile, das funktioniert und beinhaltet die Rake-Aufgabe:

gem 'gem_fresh' 

Das funktioniert aber nicht gehören die Rechen-Aufgabe:

group :development do 
    gem 'gem_fresh' 
end 

Dies scheint auf zu sein, wie Bundler benötigt Edelsteine ​​in Rails-Apps. From the documentation:

standardmäßig erzeugt eine Rails-Anwendung Bundler.require(:default, Rails.env) in Ihrem application.rb nennt, die die Gruppen in Ihrer Gemfile an die Rails-Umgebung verbindet.

Wenn aus irgendeinem Grunde, dass Rails.env Argument nicht die :development Gruppe aufgenommen wurde die Bewertung, die den Fall zu sein scheint, wenn ich rake -T nennen, würde das Juwel nicht Bundler.require -d sein, und die Rechenaufgaben wouldn‘ t geladen werden.

Die Tatsache, dass es die :development Gruppe nicht enthält, scheint eine ungerade Bundler "Gotcha" zu sein, aber zumindest jetzt weiß ich, dass das Verschieben auf die Standardgruppe löst das Problem, und es ist kein Problem mit dem Edelstein.

3

ich gerade erfolgreich Ihr Edelstein getestet und ich kann darin kein Problem mit den Rake Aufgaben sehen:

  • Ich habe gem_fresh zum Gemfile und lief bundle, der Edelstein installiert
  • Sofort konnte ich sehen, der Rechen in der Liste der Schwader:

    $ rake -T outdated 
    rake gem_fresh:outdated # outdated 
    
  • Dann aktualisiert ich die railtie.rb Datei diezu verwendenVerfahren den Rechen definiert in lib/task/metrics.rake und durchsucht die verfügbaren Rechen wieder laden:

    # lib/gem_fresh/railtie.rb: 
    rake_tasks do 
        namespace :gem_fresh do 
        desc "outdated" 
        task :outdated => :environment do 
         GemFresh::Reporter.new.report 
        end 
        end 
    
        load "tasks/metrics.rake" 
    end 
    
    $ rake -T outdated 
    rake gem_fresh:outdated  # outdated 
    rake metrics:outdated_gems # display outdated gem version metrics 
    

Also, ich habe keine Probleme mit dem Edelstein sehen. Beide Methoden in Railtie (Inline-Rake sowie Load-Methode) scheinen in Ordnung zu sein. Der einzige Unterschied, den ich festgestellt habe, ist, dass ich dies auf Schienen 4.2 getestet habe, aber ich bezweifle, dass das einen Unterschied machen würde.

Hast du den Edelstein in deine Gemfile gelegt? Wenn ich es von dort entferne, sehe ich zwar keine gem_fresh Rechen definiert.

+1

Sie haben mich zur Antwort geführt! – pjmorse

-1

ok

gem_fresh in .gemspec enthalten, aber es muss von Gemfile fehlt

das ist die Ursache für das Problem aufgetreten ist. können Sie es verifizieren.