2016-03-07 38 views
6

Abbiamo a gem che viene eseguito tramite un'attività Rake. L'attività è definita in lib/tasks/<namespace>.rake. Dopo aver letto Rake tasks inside gem not being found ho confermato che lo .gemspec include il file che definisce l'attività; c'è anche a railtie which should be including the tasks come suggerito in including rake tasks in gems. Eppure la nostra applicazione Rails 4.1 non sembra caricare il task Rake.Perché questa gemma non aggiunge attività di rake a un'app Rails?

Cosa mi manca?

risposta

3

Il problema non era con la gemma, ma con il modo in cui era inclusa nell'app.

Nel Gemfile, questo funziona e comprende il compito rake:

gem 'gem_fresh' 

questo funziona, ma non significa includono la task rake:

group :development do 
    gem 'gem_fresh' 
end 

Questo sembra essere dovuto a come Bundler richiede gemme nelle app Rails. From the documentation:

Per impostazione predefinita, un Rails app generato chiamate Bundler.require(:default, Rails.env) nel vostro application.rb, che collega i gruppi della tua Gemfile all'ambiente Rails.

Se per qualche ragione che Rails.env argomento non stava valutando per includere il gruppo :development, che sembra essere il caso quando chiamo rake -T, la gemma non sarebbe Bundler.require -d, ei compiti rake wouldn' essere caricato

Il fatto che non includa il gruppo :development sembra essere un "bundle" di Bundler dispari, ma almeno ora so che spostarlo nel gruppo predefinito risolve il problema e non è un problema con la gemma.

3

Ho provato appena successo il vostro gioiello e posso vedere alcun problema con i compiti rake in esso:

  • ho aggiunto gem_fresh al Gemfile e corse bundle, la gemma installato
  • Immediatamente ho potuto vedere il rastrello presente nella lista dei rastrelli:

    $ rake -T outdated 
    rake gem_fresh:outdated # outdated 
    
  • Poi ho aggiornato il file railtie.rb di utilizzare la load metodo per caricare il rastrello definito lib/task/metrics.rake e cercato di nuovo i rastrelli disponibili:

    # 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 
    

Quindi, posso vedere alcun problema con il vostro gioiello. Entrambi i metodi in railtie (rastrello in linea e utilizzo del metodo di caricamento) sembrano funzionare correttamente. L'unica differenza che ho notato è che ho provato questo su rails 4.2 ma dubito piuttosto che farebbe la differenza.

Hai inserito la gemma nel tuo Gemfile? Se lo rimuovo da lì, in effetti non vedo alcun rake gem_fresh definito.

+1

Mi hai portato alla risposta! – pjmorse

-1

ok

gem_fresh include .gemspec ma deve essere presente Gemfile

questo è la causa del problema si è verificato. puoi verificarlo.