33

app/assetsプロジェクトのフォルダーにあるすべての CSS および JS ファイルをプリコンパイルしたいと考えています。vendor/assets または lib/assets のすべてをプリコンパイルするのではなく、必要に応じてファイルの依存関係のみをプリコンパイルします。

次のワイルドカード設定を試しましたが、すべてが正しくプリコンパイルされません。これにより多くの余分な作業が発生し、bootstrap-sass を使用するとコンパイルが失敗することさえあります。

config.assets.precompile += ['*.js', '*.css']

でファイルのみを処理するための最善の策は何app/assetsですか? ありがとう!

4

8 に答える 8

23

config.assets.precompile = ['*.js', '*.css']

これにより、ディレクトリの深さに関係なく、アセット パス内の JavaScript または CSS がコンパイルされます。この回答で見つかりました。

于 2013-01-31T07:56:25.673 に答える
20

このタスクは、スプロケットが基になるコンパイルされていないリソースが配置されている場所を含まない論理パスで機能するという事実によって、より困難になります。

私のプロジェクトに「/app/assets/javascripts/foo/bar.js.coffee」という JS ファイルがあるとします。

sprockets コンパイラは、最初に出力ファイルの拡張子 (この場合は ".js") を決定し、次に論理パス "foo/bar.js" をコンパイルするかどうかを評価します。コンパイルされていないリソースは、「app/assets/javascripts」、「vendor/assets/javascripts」、「lib/assets/javascripts」、または gem にある可能性があるため、論理パスに基づいて特定のファイルを含める/除外する方法はありません1人。

基礎となるリソースがどこにあるかを判断するには、sprockets 環境 (オブジェクト Rails.application.assets を介して利用可能) に、論理パスが与えられたリソースの実際のパスを解決するように依頼する必要があると思います。

これが私が使用しているソリューションです。私はRubyにかなり慣れていないので、これは最もエレガントなコードではありません:

# In production.rb
config.assets.precompile << Proc.new { |path|
  if path =~ /\.(css|js)\z/
    full_path = Rails.application.assets.resolve(path).to_path
    app_assets_path = Rails.root.join('app', 'assets').to_path
    if full_path.starts_with? app_assets_path
      puts "including asset: " + full_path
      true
    else
      puts "excluding asset: " + full_path
      false
    end
  else
    false
  end
}

スプロケット > 3.0 では、Rails.application.assets が nil になるため (デフォルト: config.assets.compile = false と仮定)、これは本番環境では機能しません。

回避するには、full_pathの割り当てを次のように置き換えます。

@assets ||= Rails.application.assets || Sprockets::Railtie.build_environment(Rails.application)
full_path = @assets.resolve(path)

参照: https://github.com/rails/sprockets-rails/issues/237

于 2012-04-11T16:39:16.980 に答える
7

Railsコードでこれを見つけました:

@assets.precompile               = [ Proc.new{ |path| !File.extname(path).in?(['.js', '.css']) },
                                     /(?:\/|\\|\A)application\.(css|js)$/ ]

レールガイドでバックアップされているもの:

ファイルをコンパイルするためのデフォルトのマッチャーには、application.js、application.css、およびすべての非 JS/CSS ファイルが含まれます

を使用すると、このデフォルトはリセットされないため、 の代わりに で+=オーバーライドする必要があります。どうやら、拡張子だけでなくProc または正規表現を渡すことができることに注意してください。最上位ディレクトリ内のファイルのみをプリコンパイルする場合は、次のような正規表現を作成する必要があると思います。=+=precompile

config.assets.precompile = [ /\A[^\/\\]+\.(ccs|js)$/i ]
于 2012-04-11T04:06:48.107 に答える
6

2017年にこの投稿を再訪しています。

私たちの製品は依然として RoR を多用しており、Rails.application.config.assets.precompile新しいモジュールを追加するたびに追加することで、プリコンパイル構成を継続的に変更しています。最近、正規表現パターンを追加してこれを最適化しようとしていましたが、次の glob パターンが機能することがわかりました。

Rails.application.config.assets.precompile += %w(**/bundle/*.js)

ただし、特定のモジュールを除外する必要があるため、グロブの代わりに正規表現を使用するように努めました。

スプロケットのソース コードを調べるまで: https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L108、既に正規表現を使用していることがわかりました。

app.config.assets.precompile +=
  [LOOSE_APP_ASSETS, /(?:\/|\\|\A)application\.(css|js)$/]

したがって、コードを次のように変更します。

Rails.application.config.assets.precompile +=
  [/^((?!my_excluded_module)\w)*\/bundle\/\w*\.js$/]

これはうまくいきます。

于 2017-03-06T06:25:32.870 に答える
3

これにより、サブディレクトリ内のすべてのファイルが取得さ.css .scss.jsます。

js_prefix    = 'app/assets/javascripts/'
style_prefix = 'app/assets/stylesheets/'

javascripts = Dir["#{js_prefix}**/*.js"].map      { |x| x.gsub(js_prefix,    '') }
css         = Dir["#{style_prefix}**/*.css"].map  { |x| x.gsub(style_prefix, '') }
scss        = Dir["#{style_prefix}**/*.scss"].map { |x| x.gsub(style_prefix, '') }

Rails.application.config.assets.precompile = (javascripts + css + scss)
于 2016-03-16T10:23:38.613 に答える
2

/app と /vendor の両方からのすべてのアセットをコンパイルしたかったのですが、パーシャル (名前はアンダースコア _ で始まります) を除きます。これが私のバージョンの application.rb エントリです。

config.assets.precompile << Proc.new { |path|
  if path =~ /\.(css|js)\z/
    full_path = Rails.application.assets.resolve(path).to_path
    app_assets_path = Rails.root.join('app', 'assets').to_path
    vendor_assets_path = Rails.root.join('vendor', 'assets').to_path

    if ((full_path.starts_with? app_assets_path) || (full_path.starts_with? vendor_assets_path)) && (!path.starts_with? '_')
      puts "\t" + full_path.slice(Rails.root.to_path.size..-1)
      true
    else
      false
    end
  else
    false
  end
}

さらに、デバッグ目的でコンパイルされているファイルのリストを出力します...

于 2013-03-21T22:41:45.977 に答える
1

このスニペットには、 app/assets、vendor/assetslib/assetsの下のgem を除くすべての js/css ファイルが含まれます (部分的なファイル (例: "_file.sass") を除く)。また、すべてのページに含まれていない Gem のアセットを含めるための戦略もあります。

    # These assets are from Gems which aren't included in every page.
    # So they must be included here
    # instead of in the application.js and css manifests.
    config.assets.precompile += %w(a-gem.css a-gem.js b-gem.js)

    # This block includes all js/css files, excluding gems,
    # under: app/assets, vendor/assets, lib/assets
    # unless they are partial files (e.g. "_file.sass")
    config.assets.precompile << Proc.new { |path|
      if path =~ /\.(css|js)\z/
        full_path = Rails.application.assets.resolve(path).to_path
        aps = %w( /app/assets /vendor/assets /lib/assets )
        if aps.any? {|ap| full_path.starts_with?("#{Rails.root}#{ap}")} &&
            !path.starts_with?('_')
          puts "\tIncluding: " + full_path.slice(Rails.root.to_path.size..-1)
          true
        else
          puts "\tExcluding: " + full_path
          false
        end
      else
        false
      end
    }

ただし、gem アセットを 2 回プリコンパイルする可能性が高いため、おそらくこれを実行したくないでしょう (基本的に、application.js または css で既に \=require されているものはすべて)。このスニペットには、app/assets 、vendor/assetslib/assetsの下のgems を含むすべての js/css ファイルが含まれますが、部分的なファイル (例: "_file.sass") でない限り、

# This block includes all js/css files, including gems, 
# under: app/assets, vendor/assets, lib/assets
# and excluding partial files (e.g. "_file.sass")
config.assets.precompile << Proc.new { |path|
  if path =~ /\.(css|js)\z/
    full_path = Rails.application.assets.resolve(path).to_path
    asset_paths = %w( app/assets vendor/assets lib/assets)
    if (asset_paths.any? {|ap| full_path.include? ap}) && 
        !path.starts_with?('_')
      puts "\tIncluding: " + full_path
      true
    else
      puts "\tExcluding: " + full_path
      false
    end
  else
    false
  end
}
于 2013-10-16T20:29:13.853 に答える