rails 3.1资产管道:忽略来自宝石的资产
我不太确定实际行为是什么,所以我的第一个问题是:
来自gem(在我的情况下是Spree)的资产(例如javascripts)总是被编译?我不使用Spree的JavaScript,因此不希望它们被编译。我不要求他们在我application.js
或任何其他JavaScript文件,但rails 3.1资产管道:忽略来自宝石的资产
rake assets:precompile
编译他们仍然。我只是不想让他们躺在我的public/assets
文件夹中。
所以我想我的问题是,有没有办法禁用从宝石编译JavaScript的?
我想有一个聪明的方法来实现你的目标使用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'
我喜欢非常具体的代码是可见的这种方式。
它没有on 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
把这个放到config/initializers/duplicate_assets.rb中对我也很好。可以用rails runner测试“puts Rails.application.assets.find_asset('jquery.js').to_a.map(&:pathname)” – grosser
日Thnx了很多,我会尽力的! –
在Rails 4.0.0中,它看起来像初始化器被忽略。尝试: class Engine
mmell