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:
Sprockets::Asset
corrispondente al file sorgente (row 8). Asset
richiesto da questo. Sprockets::Asset#to_a
restituisce tale arrays (righe 9-10). 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.