Вопрос по php, sprockets, ruby, zend-framework – Использование Sprockets в качестве автономного сервиса для приложения PHP

7

Я хотел бы дублировать функцию конвейера ресурсов Rails в моем проекте Zend Framework PHP. Я думаю, что возможно использовать гем Sprockets в качестве автономного сервиса, но я не уверен, как правильно его настроить. Я не заинтересован ни в портировании Sprockets на PHP, ни в использовании PHP-порта Sprockets. В Sprockets rubygem уже есть все, что мне нужно. Мне просто нужно выяснить, как настроить его в среде без рубинов.

Update: Я понял, как запускать Sprockets в качестве приложения Rack. Теперь меня интересуют различия между средами разработки и производства. Как помощник вида Rails генерирует все<link> а также<script> теги в разработке и отпечатки пальцев одного файла в производстве?

Ваш Ответ

1   ответ
6

Вероятно, вам просто придется покопаться в источникеЗвездочки а такжеИнтеграция звездочек с Rails для того, чтобы действительно найти хорошее решение для вашей проблемы, но я надеюсь, что некоторые из этих указателей помогут.

Во-первых, проверить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

На высоком уровне этот метод делает следующее:

Determine whether to concatenate everything into a single file or include all assets individually (line 3). Determine whether we should include the digest string in the asset filename (line 5). For each given source file, retrieve the Sprockets::Asset object corresponding to that source file (line 8). If we're debugging, call the superclass method with each Asset required by this one. Sprockets::Asset#to_a returns such an array (lines 9–10). If we're not debugging (or if we fail to retrieve an Asset object for some reason), call the superclass method with the top-level Asset (or the source filename as a string) (line 13).

Многие из этих методов довольно просты и зависят только от среды, которую вы настроили. Например,digest_assets?:

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

Часть этой конфигурации сохранена вRails.application.assetsкоторый сам по себе являетсяSprockets::Environment объект. Вы можете поиграть с этим на консоли Rails, чтобы ознакомиться с ним (я очень рекомендуюдрагоценный камень awesome_print если вы еще не знакомы с ним):

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",
    # ...
]

По сути, Sprockets отвечает за определение зависимостей, конкатенацию и переваривание ваших активов, а Rails просто связывает их вместе со своими помощниками. Похоже, вы должны быть в состоянии воспроизвести это поведение в вашей среде достаточно простым способом.

Вы когда-нибудь писали что-нибудь, что могло бы помочь выложить отладочный скрипт & lt; script & gt; / & lt; ссылка & gt; теги?
спасибо, это очень полезное объяснение Andrew

Похожие вопросы