web-dev-qa-db-ja.com

Rails 3.1スプロケットにはディレクティブが必要です-特定のファイルを除外する方法はありますか?

Application.cssで//=require_tree .を使用している場合、//=require_directoryとツリー編成に頼る以外に特定のファイルを除外する方法はありますか?

おそらく//= require_tree ., {except: 'something'}のようなもの

42
tamersalama

これは、Sprockets v2.2.0以降で使用可能なSprocketの新しいstubディレクティブで可能です。ただし、Rails 3.2は、この機能を持たないSprockets v2.1.3のみを使用します。現在のところ、現在のEdge Railsにはstubディレクティブを追加すると、正式にRails 4.0以降になります)。

使用法:

//= require jquery
//= require_tree .
//= stub unwanted_js

stubディレクティブは、後続のrequireまたはincludeディレクティブで上書きできません。

Rails 3.2プロジェクトでstubディレクティブを使用する場合は、Edge Railsに切り替えるか、Rails gemをブランチする必要があります。 Sprocketsの依存関係がバージョン2.2.0に変更されました。

65

Rails 3.2.9のリリース以降、最新のスプロケットにある//= stubディレクティブを使用できるように、スプロケットをバージョン2.2.xにロックすることがサポートされています。

//= stub unwanted_js

http://weblog.rubyonrails.org/2012/11/12/ann-Rails-3-2-9-has-been-released/

したがって、それを使用するには、Rails 3.2.9にアップグレードするだけです。

17
Autodidact

注意:この回答は古くなっており、Sprocketsにこの機能が追加されています。以下の答えを見てください。

===

これは現在のSprocketsディレクティブでは不可能ですが、便利な機能のようです。

必要な各ファイルを手動で一覧表示するもう1つの方法。

おそらく、これを Sprockets リポジトリの機能リクエストとして提出できますか? :-)

4
Richard Hulse

よりよく試してください https://github.com/QubitProducts/miniMerge

JSだけでなく、基本モードのスプロケットと互換性があります。

ファイルレベルだけでなく、ブロックや行も除外できます。

複数のソースベースを持つ完全な依存管理。

私は過去にスプロケットを使用していましたが、これはCSSにも使用します。

0
brutal de luxe

次のモンキーパッチは私のためにこれを解決します:


module Sprockets
  class DirectiveProcessor
    # support for: require_tree . exclude: "", "some_other"
    def process_require_tree_directive(path = ".", *args)
      if relative?(path)
        root = pathname.dirname.join(path).expand_path

        unless (stats = stat(root)) && stats.directory?
          raise ArgumentError, "require_tree argument must be a directory"
        end

        exclude = args.shift == 'exclude:' ? args.map {|arg| arg.sub(/,$/, '')} : []

        context.depend_on(root)

        each_entry(root) do |pathname|
          if pathname.to_s == self.file or exclude.include?(pathname.basename(pathname.extname).to_s)
            next
          elsif stat(pathname).directory?
            context.depend_on(pathname)
          elsif context.asset_requirable?(pathname)
            context.require_asset(pathname)
          end
        end
      else
        # The path must be relative and start with a `./`.
        raise ArgumentError, "require_tree argument must be a relative path"
      end
    end
  end

end
0
Roman