Utilizzo di pignoni come servizio autonomo per un'applicazione PHP

Vorrei duplicare la funzionalità di pipeline di asset di Rails nel mio progetto PHP di Zend Framework. Penso che sia ansible utilizzare la gem Sprockets come servizio autonomo, ma non sono sicuro di come configurarlo correttamente. Non sono interessato a portre Sprockets su PHP, né usare una port PHP di Sprockets. Il Rubygem Sprockets ha già tutto ciò di cui ho bisogno. Ho solo bisogno di capire come installarlo in un ambiente non ruby.

Aggiornamento: ho capito come eseguire Sprockets come applicazione Rack. Ora sono interessato alle differenze tra gli ambienti di sviluppo e di produzione. In che modo l'helper vista Rails genera tutti i <link> e <script> nello sviluppo e impronte digitali di un singolo file in produzione?

Probabilmente dovresti scavare nella fonte per l' integrazione di pignoni e ruote dentate con Rails per poter davvero trovare una buona soluzione per il tuo problema, ma spero che alcuni di questi suggerimenti possano aiutarti.

Per prima cosa, dai un'occhiata a Sprockets::Helpers::RailsHelper#javascript_include_tag :

 1 def javascript_include_tag(*sources) 2 options = sources.extract_options! 3 debug = options.key?(:debug) ? options.delete(:debug) : debug_assets? 4 body = options.key?(:body) ? options.delete(:body) : false 5 digest = options.key?(:digest) ? options.delete(:digest) : digest_assets? 6 7 sources.collect do |source| 8 if debug && asset = asset_paths.asset_for(source, 'js') 9 asset.to_a.map { |dep| 10 super(dep.pathname.to_s, { :src => path_to_asset(dep, :ext => 'js', :body => true, :digest => digest) }.merge!(options)) 11 } 12 else 13 super(source.to_s, { :src => path_to_asset(source, :ext => 'js', :body => body, :digest => digest) }.merge!(options)) 14 end 15 end.join("\n").html_safe 16 end 

Ad un livello elevato, questo metodo procede come segue:

  1. Determina se concatenare tutto in un singolo file o includere tutte le risorse individualmente (row 3).
  2. Determina se includere la string digest nel nome file dell'asset (row 5).
  3. Per each dato file sorgente, recuperare l'object Sprockets::Asset corrispondente al file sorgente (row 8).
  4. Se eseguiamo il debug, richiama il metodo della superclass con each Asset richiesto da questo. Sprockets::Asset#to_a restituisce tale arrays (righe 9-10).
  5. Se non stiamo eseguendo il debug (o se non riusciamo a recuperare un object Asset per qualche motivo), chiama il metodo superclass con l' Asset livello superiore (o il nome file di origine come string) (row 13).

Molti di questi methods sono piuttosto semplici e dipendono solo dall'ambiente che hai impostato. Ad esempio, digest_assets? :

 def digest_assets? Rails.application.config.assets.digest end 

Alcune di queste configurazioni vengono salvate in Rails.application.assets , che a sua volta è un object Sprockets::Environment . Puoi effettivamente giocare con questo sulla console Rails per familiarizzare con esso (ti consiglio caldamente la gem awesome_print se non hai già familiarità con esso):

 1.9.3p194 :001 > Rails.application.assets.class Sprockets::Environment < Sprockets::Base 1.9.3p194 :002 > Rails.application.assets['application.js'].class Sprockets::BundledAsset < Sprockets::Asset 1.9.3p194 :003 > Rails.application.assets['application.js'].to_a.map(&:digest) [ [ 0] "6bb424b2409c6a5fb28acd15cc184b16", [ 1] "0ff3e5680ead3dadeee021c144835311", [ 2] "4c908739f93e83bda6b5e84f7ab10a29", [ 3] "319003f54b9408b4e41b0199e1848423", [ 4] "3f52cd966b6bb99a8f7994f5dcd7767f", [ 5] "c50a6aac16f6a69deeb722fe51e36c54", # ... ] 

Quindi, essenzialmente, Sprockets è responsabile della determinazione delle dependencies, della concatenazione e della digestione delle risorse, e Rails lo lega semplicemente insieme ai suoi aiutanti. Sembra che dovresti essere in grado di replicare questo comportmento nel tuo framework in modo ragionevolmente semplice.