Heroku НЕ компилирует файлы под конвейерами ресурсов в Rails 4

Все хорошо работает на локальной машине с конвейером активов в Rails 4 и Ruby 2.0. Но при развертывании на герою показано, что:

-----> Preparing app for Rails asset pipeline
   Running: rake assets:precompile
   I, [2013-03-12T03:28:29.908234 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/rails-2ee5a98f26fbf8c6c461127da73c47eb.png
   I, [2013-03-12T03:28:29.914096 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/trash-3c3c2861eca3747315d712bcfc182902.png
   I, [2013-03-12T03:28:33.963234 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-bf2525bd32aa2a7068dbcfaa591b3874.js
   I, [2013-03-12T03:28:40.362850 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-13374a65f29a3b4cea6f8da2816ce7ff.css
   Asset precompilation completed (14.36s)

Heroku, похоже, компилирует файлы, но помещает их в /tmp без каких-либо ошибок. Мои вопросы:

  • Почему Heroku компилирует файлы активов в /tmp?
  • Моим последним решением было запустить RAILS_ENV = производственный пакет exec rake assets: прекомпилировать локально, но это создало манифест-xxxxxx.json в public/assets, а не manifest.yml, так что heroku не обнаруживает манифест JSON файл. Я разобрал его вручную, создав yml из json файла, и героку стал счастливым. Был ли устаревший герою?

Ответ 1

Плагины активов Heroku больше не работают, поскольку Rails 4 не поддерживает плагины. Вместо этого вам нужно использовать драгоценные камни Героку. Поместите это в свой Gemfile:

group :production do
  gem 'rails_log_stdout',           github: 'heroku/rails_log_stdout'
  gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'
end

Следуйте руководству Heroku о начале работы с Rails 4.

Обновление (07/22/2013): Heroku теперь поставляет другой драгоценный камень для прекомпиляции активов.

group :production do
  gem 'rails_12factor'
end

Ответ 2

Вам нужно настроить Rails для обслуживания статических активов в процессе производства: config/environment/production.rb

SampleApp::Application.configure do
  .
  .
  .
  config.serve_static_assets = true
  .
  .
  .
end

UPDATE:

В Rails 4 устарела и была изменена:

config.serve_static_files = true 

Ответ 4

Я точно вхожу в ту же проблему.

Я устанавливаю config.serve_static_assets = true в файле environment/production.rb, пока heroku не поддержит новый формат манифеста.

Итак, это временное решение до тех пор, пока поддержка герою не будет добавлена.

Ответ 5

После нескольких часов работы в поисковых системах, в которых ни один из гидов на Heroku или предложения на StackOverFlow не помогли мне, я, наконец, столкнулся с этим сообщением в блоге, предложил эту подсказку:

heroku labs:enable user-env-compile --app=YOUR_APP

Без этого конвейер ресурсов всегда будет пытаться запустить все приложение и подключиться к базе данных (несмотря на все, что вы, возможно, читали, что рельсы 4 теперь дольше это делают). Это позволяет настроить вашу конфигурацию Heroku на Rails, чтобы она могла успешно загрузиться и выполнить задачи рейка, такие как активы: precompile.

Ответ 6

Мне нужно было использовать этот камень:

gem 'rails_12factor', group: :production #need this for rails 4 assets on heroku

И в /config/environments/production.rb Мне нужно было установить:

config.assets.compile = true

Я понимаю, что камень rails_12_factor устанавливает config.serve_static_assets = true, среди прочего.

Ответ 7

В моем случае активы, скомпилированные в соответствии с приведенными выше инструкциями, но не выбрали "fontawesome-webfont" загрузочного глификона, так что это сработало для меня, наконец, потратив столько времени на исследования.

Файл Gem

gem 'rails_12factor', group: :production

установить пакет

конфиг /application.rb

config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif,
                                  "fontawesome-webfont.ttf",
                                 "fontawesome-webfont.eot",
                                 "fontawesome-webfont.svg",
                                 "fontawesome-webfont.woff")



config.assets.precompile << Proc.new do |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
    end

окружающая среда /production.rb

config.serve_static_assets = true

Тогда, наконец, я побежал rake assets:precompile RAILS_ENV=production и нажал на герою, и это сработало.

Ответ 8

Это была проблема с Heroku Ruby Buildpack, но обновление было развернуто сегодня (2013-05-21). Пожалуйста, попробуйте и сообщите нам об этом.

Чтобы ответить на ваши вопросы:

# 1) Это вывод звездочек; вещи скомпилированы до /tmp, а затем перемещены (см. здесь, в Sprockets). Насколько мне известно, это всегда делалось так, но только до версии Sprockets, обновленной в Rails, мы получили этот новый вывод отладочного типа.

# 2) Ранее assets:precompile генерировал файл manifest.json, но теперь в Rails 4 файл манифеста имеет в нем отпечаток пальца, который ранее не был обнаружен. Это было исправлено с помощью # 74.

Ответ 9

Я добавил это в начало одного из моих файлов css.scss в папке assets/stylesheets/.

@import "font-awesome";

затем выполнил..

rake assets:clean

и...

rake assets:precompile RAILS_ENV=production

Ответ 10

В Rails 4.2.4 ваш файл production.rb имеет строку:

config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

Это означает, что gem 'rails_12factor', group: :production не нужно менять его на true, поскольку он может быть установлен через переменные среды heroku. Вы также получите предупреждение, если вы удалите камень rails_12factor.

Если у вас есть проблемы с активами, войдите в консоль heroku heroku run rails console и узнайте путь к ресурсу для файла puts helper.asset_path("application.js").

Одно странное поведение, которое я заметил между разработкой и производством, когда окончание файла не предусмотрено:

С изображением /assets/images/image_01.jpg следующий результат из asset_paths отличается:

Развитие

development > puts helper.asset_path('profile_01') 
=> /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg

development > puts helper.asset_path('profile_01.jpg') 
=> /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg

Продукция

development > puts helper.asset_path('profile_01') 
=> /profile_01

development > puts helper.asset_path('profile_01.jpg') 
=> /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg

Вы выполняете не RAILS_ENV=production rake assets:precompile, а heroku делает это для вас во время развертывания. Также вам не нужно предварительно компилировать активы в разработке и подталкивать их к героку.

Ответ 11

Кроме того, что у вас установлен монстр "rails_12factor", вам нужно только сделать это.

# config/application.rb

config.assets.paths << Rails.root.join('vendor', 'assets')

Кажется, что, хотя Rails точно знает, чего он хочет, Heroku нуждается в напоминании о том, чтобы включить папку с ресурсами в качестве части путей к ресурсам.

Ответ 13

Если вы используете ресурсы контроллера, как в:

 <%= javascript_include_tag params[:controller] %> or <%= javascript_include_tag params[:controller] %>

Затем в процессе производства вам необходимо явно предварительно скомпилировать те (в rails для разработки компилирует файлы на лету).

Смотрите официальное руководство Rails здесь: http://guides.rubyonrails.org/asset_pipeline.html#controller-specific-assets

Чтобы прекомпилировать, как описано в руководствах (здесь: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets), вам нужно добавить следующее в config/application.rb

# config/application.rb
config.assets.precompile << Proc.new do |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
end

Ответ 14

Я полагаю, что добавлю это как ответ, поскольку этот вопрос связан с страницей поддержки Heroku, если вы ищете "assets".

Это в основном для людей, которые обновляют свое приложение до Rails 4, но, пройдя через это - и многие другие сообщения SO - что, наконец, получило меня, изменило следующее в production.rb:

config.action_dispatch.x_sendfile_header = "X-Sendfile"

To:

config.action_dispatch.x_sendfile_header = nil

Я не поймал этого, когда я обновился, и, как обычно, мне потребовалось навсегда выяснить. Надеюсь, это поможет кому-то еще! Кричите PatrickEm, который спросил/ответил на то же в question.

Ответ 15

Использовать расширения изображений

У меня была эта же проблема, но по другой причине.

Вместо

<%= asset_path 'facebook-link' %>

Применение:

<%= asset_path 'facebook-link.png' %>

В то время как первый работал локально, когда я нажал на Heroku, мои изображения ломались, и я не знал, почему. При использовании полного расширения файла исправлена ​​проблема:)