6

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

rake assets:precompile

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

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

4

2 回答 2

3

导轨 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)
于 2014-06-27T16:33:22.677 回答
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

刚刚尝试了一个技巧:将代码放入 aninitializer但在您的末尾需要它application.rb

require "config/initializers/your_file'

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

于 2011-08-23T16:09:29.070 回答