конвейер активов rails 3.1: игнорировать активы из драгоценного камня

Я не совсем уверен, каково фактическое поведение, поэтому мой первый вопрос:
Всегда ли компилируются ресурсы (например, javascripts) из драгоценного камня (в моем случае Spree)? Я не использую javascripts Spree и поэтому не хочу, чтобы они компилировались. Я не требую их в моем application.js или любом другом файле javascript, но

rake assets:precompile

тем не менее их компилирует. Я просто не хочу, чтобы они лежали в моей папке public/assets.

Итак, я думаю, мой вопрос в том, есть ли способ отключить компиляцию javascripts из драгоценного камня?


person Marian Theisen    schedule 23.08.2011    source источник


Ответы (2)


Я думаю, есть разумный способ достичь своей цели, используя sprockets. Может быть, require_directory вместо require_tree.

Но самым прямым было бы удалить эти активы из путей ваших активов. Для этого добавьте этот в самый конец файла application.rb (не работает в инициализаторе):

class Engine < Rails::Engine
   initializer "remove assets directories from pipeline" do |app|
     app.config.assets.paths = app.config.assets.paths - app.config.assets.paths.grep(/nice_regexp_here_to_match_the_dir_where_the_unwanted_files_live/)
   end
end

Только что попробовал хак: поместите код в initializer, но потребуйте его в конце вашего application.rb:

require "config/initializers/your_file'

Я предпочитаю, чтобы очень специфический код был виден таким образом.

person apneadiving    schedule 23.08.2011
comment
В Rails 4.0.0 инициализатор игнорируется. Попробуйте: class Engine ‹ Rails::Engine config.assets.paths = ... end - person mmell; 20.05.2013

Рельсы 4.Х

Это не сработало на Rails 4.X, возможный (грязный) обходной путь:

require 'sprockets/railtie'

Bundler.require(:default, Rails.env)

module Sprockets
  module Paths
    SKIP_GEMS = ["rails-assets-jquery", "rails-assets-bootstrap"]

    def append_path_with_rails_assets(path)
      append_path_without_rails_assets(path) unless SKIP_GEMS.any? { |gem| path.to_s.start_with?(Gem.loaded_specs[gem].full_gem_path) }
    end

    alias_method_chain :append_path, :rails_assets
  end
end

Обновление для Rails 5.X

alias_method_chain устарел, начиная с Rails 5.X. Вот обновленная версия с использованием prepend и переопределением модуля Sprockets::Environment вместо Sprockets::Paths.

module SprocketsPathsOverride
  SKIP_GEMS = ["rails-assets-jquery", "rails-assets-bootstrap"]

  def append_path(path)
    should_skip = SKIP_GEMS.any? do |gem|
      path.to_s.start_with?(Gem.loaded_specs[gem].full_gem_path)
    end
    super(path) unless should_skip
  end
end

Sprockets::Environment.prepend(SprocketsPathsOverride)
person knoopx    schedule 27.06.2014
comment
добавление этого в config/initializers/duplicate_assets.rb у меня тоже сработало. Можно протестировать с помощью rails runner. - person grosser; 16.04.2015