【问题标题】:rails 3.1 asset pipeline: ignore assets from a gemrails 3.1资产管道:忽略gem中的资产
【发布时间】:2011-08-23 15:08:40
【问题描述】:

我不太确定实际行为是什么,所以我的第一个问题是:
是否总是编译来自 gem(在我的情况下为 Spree)中的资产(例如 javascripts)?我不使用 Spree 的 javascripts,因此不希望它们被编译。我的application.js 或任何其他 javascript 文件中不需要它们,但是

rake assets:precompile

仍然编译它们。我只是不想让他们躺在我的public/assets 文件夹中。

所以我想我的问题是,有没有办法禁用从 gem 编译 javascript?

【问题讨论】:

    标签: ruby-on-rails sprockets asset-pipeline


    【解决方案1】:

    Rails 4.X

    它在 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)
    

    【讨论】:

    • 将它放入 config/initializers/duplicate_assets.rb 对我来说也很好。可以使用 rails runner "puts Rails.application.assets.find_asset('jquery.js').to_a.map(&:pathname)" 进行测试
    【解决方案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'
    

    我更喜欢以这种方式显示非常具体的代码。

    【讨论】:

    • 在 Rails 4.0.0 中,初始化程序似乎被忽略了。试试:class Engine
    最近更新 更多