Rails config.aktywa.ustawienie precompile do przetwarzania wszystkich plików CSS i JS w App / assets

Chcę wstępnie skompilować wszystkie pliki CSS i JS w folderze app/assets mojego projektu. Nie chcę prekompilować wszystkiego w vendor / assets lub lib / assets, tylko zależności moich plików w razie potrzeby.

Próbowałem poniższego ustawienia wieloznacznego, ale to niepoprawnie prekompiluje wszystko. Powoduje to dużo dodatkowej pracy, a nawet powoduje awarię kompilacji podczas używania bootstrap-sass.

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

Jak najlepiej przetworzyć moje pliki tylko w app/assets? Dzięki!

Author: geoff, 2012-04-11

8 answers

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

, który skompiluje dowolny JavaScript lub CSS w ścieżce zasobu, niezależnie od głębokości katalogu. Znalezione przez Ta odpowiedź .

 23
Author: techpeace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:45

Zadanie to jest utrudnione przez fakt, że sprockets działa ze ścieżkami logicznymi, które nie obejmują miejsca, w którym znajduje się podstawowy, nieskomplikowany zasób.

Załóżmy, że mój projekt ma plik JS " / app/assets/javascripts/foo / bar.js.kawa".

Kompilator sprockets najpierw określi rozszerzenie pliku wyjściowego, w tym przypadku".js", a następnie ocenić, czy skompilować ścieżkę logiczną " foo / bar.js". Nieskomplikowany zasób może być w "app / assets / javascripts"," vendor/assets/javascripts"," lib/assets/javascripts " lub gem, więc nie ma możliwości włączenia/wykluczenia konkretnego pliku na podstawie samej ścieżki logicznej.

Aby określić, gdzie znajduje się zasób podstawowy, uważam, że należy zapytać środowisko zębatek (dostępne za pośrednictwem szyn obiektowych.podanie.zasoby), aby rozwiązać rzeczywistą ścieżkę zasobu podaną ścieżką logiczną.

Oto rozwiązanie, którego używam. Jestem całkiem nowy w Ruby, więc to nie jest najbardziej elegancki kod:

# 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
}

Z zębatkami > 3.0, to nie zadziała w produkcji, ponieważ szyny.podanie.aktywa będą zerowe (przy założeniu domyślnego: config.aktywa.compile = false).

Aby obejść obejście, zamieniasz full_path przypisanie na:

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

Zobacz też: https://github.com/rails/sprockets-rails/issues/237

 18
Author: keithgaputis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-06 15:59:54

Drobna zmiana w odpowiedzi techpeace:

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

Dodałbym komentarz do jego odpowiedzi, ale nie mam jeszcze wystarczającej reputacji. Daj mi głos i będę tam!

Uwaga: spowoduje to również prekompilację wszystkich CSS / JavaScript zawartych przez rubygems.

 13
Author: eltiare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-24 21:50:05

Znalazłem to w kodzie rails:

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

Który jest wsparty prowadnicą rails:

Domyślny matcher do kompilacji plików zawiera aplikację.js, podanie.css i wszystkie pliki inne niż JS / CSS

Ta wartość domyślna nie jest resetowana, jeśli używasz +=, więc musisz ją zastąpić = zamiast +=. Zauważ, że najwyraźniej możesz przekazać Proc lub regex do precompile, jak również rozszerzenie. Wierzę, że jeśli chcesz preompilować tylko pliki w górnej level directory, będziesz musiał utworzyć regex w stylu:

config.assets.precompile = [ /\A[^\/\\]+\.(ccs|js)$/i ]
 7
Author: Michael Slade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-11 04:13:43

This will get all .css .scss i .js łącznie ze wszystkimi plikami w podkatalogach.

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)
 3
Author: TJ Biddle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-16 10:23:38

Chciałem skompilować wszystkie zasoby z /app i / vendor, z wyjątkiem częściowych (których nazwa zaczyna się od podkreślenia_). Oto moja wersja wpisu w aplikacji.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
}

Dodatkowo wyświetla listę plików kompilowanych do celów debugowania...

 2
Author: Piotr Kuczynski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-21 22:41:45

[[4]}wracam do tego postu w roku 2017.

Nasz produkt nadal mocno korzysta z RoR, nieustannie modyfikujemy nasze konfiguracje precompile dodając Rails.application.config.assets.precompile podczas dodawania nowych modułów. Ostatnio próbowałem zoptymalizować to dodając wzór regex, okazało się, że następujący wzór glob działa:

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

Jednak nadal muszę wykluczyć niektóre moduły, więc starałem się użyć regex zamiast glob.

Dopóki nie zajrzałem do kodu źródłowego sprockets: https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L108 , odkryłem, że już używają regex:

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

Więc zmieniam mój kod na:

Rails.application.config.assets.precompile +=
  [/^((?!my_excluded_module)\w)*\/bundle\/\w*\.js$/]
Co działa dobrze.
 2
Author: Evi Song,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 06:25:32

Ten fragment zawiera wszystkie pliki JS / css, z wyjątkiem gems , pod: app/ assets, vendor / assets, lib / assets, chyba że są plikami częściowymi (np. " _file.sass"). Ma również strategię włączania zasobów z klejnotów, które nie są zawarte na każdej stronie.

    # 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
    }

Chociaż prawdopodobnie nie chciałbyś tego robić, ponieważ prawdopodobnie dwukrotnie kompilujesz zasoby gem (w zasadzie wszystko, co jest już wymagane w Twojej aplikacji.js lub css). Ten fragment zawiera wszystkie pliki JS / css, w tym gems , pod: app/ assets, vendor/assets, lib / assets, chyba że są plikami częściowymi (np. " _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
}
 0
Author: proteantech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 15:14:47