Как в Monkey-Patch Rails использовать Gulp-rev-all Manifest.json?

Я использую Rails 4.2, Ruby 2.2.

Я создал новое приложение, используя: rails new app --skip-sprockets

Все мои Gulp Tasks успешно выполняются (их много: от gulp-changed и gulp-livereload до gulp-minify-css, gulp-uncss и других).

Используя gulp-rev-all, я могу сгенерировать все ресурсы с соглашением об именах MD5 Fingerprint.

Они правильно сохраняются в rev-manifest.json

app/assets/rev-manifest.json:

{
  "rev-manifest.json": "rev-manifest.9680cee8.json",
  "images/measurement.png": "images/measurement.cedb4145.png",
  "images/measurement2.png": "images/measurement2.cedb4145.png",
  "scripts/chachin.js": "scripts/chachin.5f30b461.js",
  "stylesheets/chachin.scss": "stylesheets/chachin.4c7c499d.scss"
}

app/helpers/application_helper.rb

module ApplicationHelper

  def stylesheet_link_tag(url, options={})
    url = AssetManifest.stylesheet_path(url)

    super(url, options)
  end

  def crossorigin_javascript_include_tag(url, options={})
    url = AssetManifest.javascript_path(url)

    super(url, options)
  end

  def image_tag(url, options={})
    url = AssetManifest.asset_path(url)

    super(url, options)
  end

  def image_path(url, options={})
    url = AssetManifest.asset_path(url)

    super(url, options)
  end

  def image_url(url, options={})
    url = AssetManifest.asset_path(url)

    super((ActionController::Base.asset_host || "") + url, options)
  end

end

config/initializers/asset_manifest.rb

class AssetManifest

  def self.manifest
    if File.exists?("app/assets/rev-manifest.json")
      @manifest ||= JSON.parse(File.read("app/assets/rev-manifest.json"))
    end
  end

  def self.stylesheet_path(url)
    if AssetManifest.manifest
      url += ".css" unless url.end_with?(".css")
      AssetManifest.manifest[url] || url
    else
      url
    end
  end

  def self.javascript_path(url)
    if AssetManifest.manifest
      url += ".js" unless url.end_with?(".js")
      AssetManifest.manifest[url] || url
    else
      url
    end
  end

  def self.asset_path(url)
    if AssetManifest.manifest
      AssetManifest.manifest[url] || url
    else
      url
    end
  end
end

Я что-то упускаю?


person Jonathan Soifer    schedule 07.12.2015    source источник


Ответы (1)


Вероятно, было бы неплохо включить Rails.root в путь к файлу манифеста актива.

Вот что я сделал:

config/initializers/asset_manifest.rb

class AssetManifest

  MANIFEST_FILE = "rev-manifest.json"

  class << self

    def manifest
      @manifest ||= read_manifest(manifest_file_path)
    end

    def stylesheet_path(url)
      url += ".css" unless url.end_with?(".css")
      AssetManifest.manifest[url] || url
    end

    def javascript_path(url)
      url += ".js" unless url.end_with?(".js")
      AssetManifest.manifest[url] || url
    end

    def asset_path(url)
      AssetManifest.manifest[url] || url
    end

    private

    def manifest_file_path
      File.join(Rails.root, "app", "assets", MANIFEST_FILE)
    end

    def read_manifest(path)
      if File.exists?(path)
        JSON.parse(File.read(manifest_file_path))
      else
        {}
      end
    end

  end
end

Совет по https://bugsnag.com/blog/replacing-the-rails-asset-pipeline-with-gulp за прекрасное введение в использование gulp вместо sprockets в качестве конвейера ресурсов.

person defsprite    schedule 08.12.2015
comment
Я попробую это, но опять же, мне нужно будет включить Rails.root в файл, сгенерированный Gulp, верно? Доступен ли Rails.root для Gulp? - person Jonathan Soifer; 09.12.2015
comment
Я так не думаю, пока у вас есть gulpfile.js в этом каталоге и вы запускаете его оттуда, вы можете настроить его относительно локального каталога ("."). Обратите внимание, что, вероятно, лучше сгенерировать все активы в public/assets, так как app/assets не будет обслуживаться приложением rails без дополнительной настройки. - person defsprite; 13.12.2015