6

実際の動作がよくわからないので、最初の質問は次のとおり
です。gem (私の場合は Spree) からのアセット (JavaScript など) は常にコンパイルされますか? 私は Spree の JavaScript を使用していないため、それらをコンパイルしたくありません。私application.jsや他のJavaScriptファイルではそれらを必要としませんが、

rake assets:precompile

それにもかかわらず、それらをコンパイルします。public/assetsそれらを自分のフォルダに置きたくないだけです。

私の質問は、gem からの JavaScript のコンパイルを無効にする方法はあるのでしょうか?

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_chainRails 5.X 以降では非推奨です。これは、 を使用し、 の代わりにモジュールprependをオーバーライドした更新バージョンです。Sprockets::EnvironmentSprockets::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

ハックを試してみました:コードをに入れますがinitializer、の最後に必要ですapplication.rb:

require "config/initializers/your_file'

私は非常に具体的なコードをこのように表示することを好みます。

于 2011-08-23T16:09:29.070 に答える