2009-12-10 15 views
57

1) Esiste un posto "migliore" per le attività di rake all'interno delle gemme? Li ho visti in/tasks,/lib/tasks e li ho visti scritti come * .rb e * .rake - non sono sicuro di quale (se presente) sia 'corretto'incluse le attività di rake nelle gemme

2) Come fare Li ho resi disponibili all'app una volta che la gemma è stata configurata nell'ambiente?

+1

Se dovessi continuare a cercare una risposta migliore, colpisco la mia testa sul muro quando cerco di far funzionare anche facebooker, che è disponibile come gemma, ma non funziona perché tutte le dipendenze tra le attività del rake sono praticamente esaurite. –

+0

questo mi ha aiutato: http://blog.nathanhumbert.com/2010/02/rails-3-loading-rake-tasks-from-gem.html – User

risposta

44

Su Rails 3, lo fai tramite Railties. Ecco il codice di farlo per un gioiello che ho appena fatto:

class BackupTask < Rails::Railtie 
    rake_tasks do 
    Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f } 
    end 
end 

Così si crea fondamentalmente una classe che eredita da Rails :: Railtie, poi all'interno di quella classe che si dispone di un blocco rake_tasks che carica i file in questione. È necessario caricare invece di richiedere se si desidera utilizzare un'estensione .rake.

Ho scoperto che ho bisogno di specificare il percorso completo per Dir (da qui la ginnastica File.join). Se volessi semplicemente elencare il file in modo esplicito, potrei farla franca dicendo "load" tasks/foo.rake "" perché la dir di lib della mia gem era nel percorso di caricamento.

+2

Sapresti come aggiungere attività rake in un progetto non-rail? – lulalala

+1

+1 per questa risposta in Rails 4, è ben documentato [qui] (http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html). Per i non-rail, vedi [questo post] (http://stackoverflow.com/questions/13858495/ruby-accessing-rake-task-from-a-gem-withoutrails) – zrisher

+0

lavori confermati anche su binari 4.2 – equivalent8

31

O /tasks e lib/tasks sono un buon posto. Io uso /tasks quando le attività sono destinate a essere utilizzate per lavorare o gestire la gemma stessa, io uso lib/tasks quando le attività devono essere caricate dagli utenti Gem.

Questo perché gli utenti potrebbero avere qualche problema nel caricamento di file ruby ​​al di fuori della cartella lib che viene automaticamente aggiunta al percorso di caricamento quando è richiesta la gemma.

Inoltre, suggerisco di utilizzare l'estensione * .rake. Oggigiorno quasi ogni IDE associa l'estensione .rake ai file ruby ​​e l'IDE più avanzato può persino analizzare il contenuto come script di rake. L'estensione .rake è una scelta migliore anche per gli sviluppatori perché è possibile fornire una panoramica immediata del contenuto all'interno del file.

Sulla tua seconda domanda, al momento non c'è modo di avere Rails che carica le tue attività di rake quando il plugin è impacchettato come Gem. Devi includere il file rake nella tua applicazione (in un altro file rake o nel Rakefile principale) o clonare le attività rake nel tuo progetto.

Se si installa il plug-in nella cartella del fornitore, tutti i file *.rake in entrambe le attività e le directory lib/tasks vengono caricati automaticamente nello scope Rails dalle seguenti due righe.

Dir["#{RAILS_ROOT}/vendor/plugins/*/tasks/**/*.rake"].sort.each { |ext| load ext } 
Dir["#{RAILS_ROOT}/vendor/plugins/*/lib/tasks/**/*.rake"].sort.each { |ext| load ext } 
+0

E dove avrei messo quelle due righe a partire da Dir? Questa risposta è ancora valida per Rails 4? – Spundun

+0

La prima metà di questa risposta è ottima. La seconda metà sembra anticipare Rails 3 e non è aggiornata. Usa un binario per far sì che Rails carichi le attività come spiega la risposta di @ edebill. – drewish

11

per Rails 3 di supporto, la linea superiore del vostro lib file/.RB può essere:

Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake) 

per Rails 2 il supporto, il programma di installazione gemma dovranno modificare la loro Rakefile e aggiungere:

Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext } 

dopo le dichiarazioni obbligatorie.

NOTE:

  • Assicurarsi di sostituire con il nome del gioiello vero e proprio.
  • Questo assume tutti i compiti rake Rails-visibili sono in lib/task/

non ho più facile ancora trovato nulla. Commenti?

Problemi correlati