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
Ответ 3
Так как rails 4 заменил manifest.yml на манифест (fingerprint).json, вам нужно включить статический актив.
Из Начало работы с Rails 4.x на Heroku:
gem 'rails_12factor', group: :production
затем
bundle install
и, наконец,
git push heroku
Исправлена ошибка. Надеюсь, это поможет!
Ответ 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 нуждается в напоминании о том, чтобы включить папку с ресурсами в качестве части путей к ресурсам.
Ответ 12
Добавьте этот драгоценный камень gem 'rails_serve_static_assets'
https://github.com/heroku/rails_serve_static_assets
Ответ 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, мои изображения ломались, и я не знал, почему. При использовании полного расширения файла исправлена проблема:)