2016-03-07 23 views
6

Mamy a gem, który działa poprzez zadanie Rake. Zadanie jest zdefiniowane w lib/tasks/<namespace>.rake. Po przeczytaniu Rake tasks inside gem not being found potwierdziłem, że .gemspec zawiera plik definiujący zadanie; istnieje również a railtie which should be including the tasks zgodnie z sugestią podaną w including rake tasks in gems. A jednak nasza aplikacja Rails 4.1 wydaje się nie ładować zadania Rake.Dlaczego ten klejnik nie dodaje zadań rake do aplikacji Rails?

Czego mi brakuje?

Odpowiedz

3

Problem nie był związany z klejnotem, ale ze sposobem, w jaki został zawarty w aplikacji.

W Gemfile, to działa i zawiera zadania Zgrabiarka:

gem 'gem_fresh' 

To działa, ale nie obejmować zadania Zgrabiarka:

group :development do 
    gem 'gem_fresh' 
end 

Wydaje się to być spowodowane jak Program Bundler wymaga klejnotów w aplikacjach Rails. From the documentation:

Domyślnie aplikacja Rails generowane wzywa Bundler.require(:default, Rails.env) w environment.rb, która łączy grup w swojej Gemfile środowiska Rails.

Jeśli z jakiegoś powodu, że Rails.env argument nie został oceniającego obejmuje grupę :development, który wydaje się być przypadek, gdy zadzwonię rake -T, gem nie byłoby Bundler.require -d, a zadania Rake wouldn” t być załadowany.

To, że nie jest to grupa , wydaje się dziwnym "gruchotem" Bundlera, ale przynajmniej teraz wiem, że przeniesienie go do domyślnej grupy rozwiązuje problem i nie stanowi to problemu z klejnotem.

3

Właśnie z powodzeniem przetestowany swój gem i widzę żadnego problemu z zadaniami prowizji w nim:

  • I dodaną gem_fresh do Gemfile i pobiegł bundle, gem zainstalowany
  • Natychmiast mogłem zobaczyć obecny grabie w liście grabi:

    $ rake -T outdated 
    rake gem_fresh:outdated # outdated 
    
  • Potem zaktualizowany plik railtie.rb korzystania z load metoda załadować grabie zdefiniowany w lib/task/metrics.rake i ponownie przeszukali dostępne zgrabiarki:

    # 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 
    

Więc nie widzę problemu z gem. Obie metody w railtie (inline rake, jak również przy użyciu metody load) wydają się działać poprawnie. Jedyną różnicą, jaką zauważyłem, było to, że testowałem to na szynach 4.2, ale raczej wątpię, że to by miało znaczenie.

Umieściłeś klejnot w swojej Gemfile? Jeśli usunę go stamtąd, nie widzę żadnych zgrabiaczy gem_fresh.

+1

Poprowadziłeś mnie do odpowiedzi! – pjmorse

-1

ok

gem_fresh jest wliczone w .gemspec należy jednak brakuje Gemfile

ów jest przyczyną problemu nastąpiło. możesz to zweryfikować.