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


77

У локальній машині все працює добре з конвеєром активів у Rails 4 та Ruby 2.0. Але при розгортанні на heroku показано, що:

-----> 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 без помилок. Мої запитання:

  1. Як так Heroku компілює файли активів у / tmp?
  2. Моїм останнім рішенням було запустити RAILS_ENV = виробничий пакет exec rake assets: попередньо скомпілювати локально, але це породило manifest-xxxxxx.json у public / assets, а не manifest.yml, так що heroku не виявляє файл маніфесту JSON. Я розібрався, створивши вручну yml з файлу json, і heroku став щасливим. Чи застарілий підхід героку?

1) хтось
розбирається

2) що змінилося на рейках 4, є запит на витяг до buildpack, щоб оновити його
catsby 12.03.13

@ctshryock якісь оновлення щодо цього?
Tadas T,

Для випуску маніфесту є github.com/heroku/heroku-buildpack-ruby/pull/74 . Я буду просити людей про проблему / tmp / сьогодні, все ще відбувається, чи не так?
cats від

@ctshryock Так, на жаль, це все ще відбувається ... Дякую за належний внесок ...
Боті,

Відповіді:


102

Плагіни активів Heroku більше не працюють, оскільки Rails 4 не підтримує плагіни. Натомість вам потрібно використовувати дорогоцінні камені Heroku. Помістіть це у свій 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.

Оновлення (22.07.2013): Heroku тепер постачає інший дорогоцінний камінь для попередньої компіляції активів.

group :production do
  gem 'rails_12factor'
end

14
Це не було для мене необхідним. Просто треба було слідувати відповіді @Israel Barba, щоб змінити config.serve_static_assets = falseна true.
Метт Де Леон,

2
Раніше я робив це таким чином, але я вважаю, що якщо ви зробите це так, вам доведеться попередньо скласти активи та вчинити їх самостійно. Це все ще правильно?
Джозеф Равенвольф

Це працювало без попередньої компіляції. Може бути сценарій, коли це не спрацьовує, що я не вловлю (у мене була лише одна проста таблиця стилів)
Метт Де Леон,

2
Це не працює. Як і попередня компіляція. Для нас трубопровід активів зламаний на героку для рейок 4, і ми витратили величезний час, повернувшись до ec2 - бурчання бурчання.
Джошуа Колден

4
Чи використовуєте ви помічник activ_path () у своєму CSS та деінде? Посилання на ресурси через "/assets/filename.jpg" також не буде працювати на Heroku.
Джозеф Равенвольф

33

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

SampleApp :: Application.configure do
  .
  .
  .
  config.serve_static_assets = істина
  .
  .
  .
кінець

ОНОВЛЕННЯ:

У Rails 4 застарілий і був змінений:

config.serve_static_files = true 

1
Мені також довелося видалити мою папку public / assets, оскільки вони були попередньо скомпільовані локально кимось іншим у моїй команді, перевірені в GitHub і перезаписали процес складання активів Heroku.
user1515295

16

Оскільки rails 4 замінив manifest.yml на manifest- (fingerprint) .json , вам потрібно буде активувати статичне обслуговування ресурсів .

З початку роботи з Rails 4.x на Heroku :

gem 'rails_12factor', group: :production

тоді

bundle install

і, нарешті,

git push heroku

Виправлено проблему для мене. Сподіваюся, це допомагає!


1
так говорять в офіційному документі, але чи працює це для інших людей? У мене це було на моєму gemfile, і файли javascript все ще здавались, що вони не були попередньо скомпільовані
Maximus S

1
Я зробив усе: gem 'rails_12factor', group:: production config.serve_static_assets = true config.assets.precompile + =% w (* .css * .js) У мене є js і css-файли під vendor / assets /. Коли я розгортаюся на heroku, все виглядає добре: Запуск: rake assets: precompile Попередня компіляція активів завершена (310.44s) Коли я бачу application-5c84e59d83c00fd13fb659edc18db24a.js, все порожньо.
Олександр Хіральдо

У мене це не спрацювало. config.serve_static_assets = trueозначало, що css почав правильно обслуговуватися, але не зображення або JS.
Alex Lynham,

Це спрацювало для мене, дякую @voss за оновлену відповідь. Heroku замінив rails_log_std_out та rails3_serve_static_assets на rails_12factor.
Аарон Грей,

як ви посилаєтесь на свої зображення? Я спробував background-image: url ('/ public / assets / starsw600.jpg'); і просто ('starsw600.jpg'). Не пробували всі комбінації з config.serve_static_assets та ('starsw60xxxxxx.jpg).
flobacca

14

Я точно стикаюся з тією ж проблемою.

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

Тож це тимчасове рішення, доки не буде додана підтримка heroku.


це не працює. Heroku вводить це, що робить саме це: тобто це не спрацює, найкраще рішення поки: скопіюйте manifest.json у manifest.yml (перетворення не потрібно), щоб обдурити Heroku у виявленні попередньо скомпільованих активів.
dakull

5
Якщо ви обслуговуєте статичні активи, це спрацює, але це не спрацює для всіх дорогоцінних каменів, які мають власні активи, як Font Awesome або HTML5 Boilerplate.
Джозеф Равенвольф

@dakull, який працював у тому, що тепер він правильно обслуговує файли JS, але текстури фонового зображення в app/assets/imagesкаталозі все ще не обслуговуються.
Alex Lynham,

13

Після годин гуглиння, в якому мені не допомогли жоден з посібників на Heroku чи пропозиції щодо StackOverFlow, я нарешті наткнувся на цю публікацію в блозі, яка запропонувала такий підказку:

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

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


нарешті щось, що спрацювало. Там сказано, що ця функція є експериментальною і може бути вилучена в будь-який час.
tmartin314

10
"Немає такої функції: user-env-compile"
Андреас Баумгарт,

Це вже не лабораторна функція, але вона за замовчуванням включена в стек Heroku. Більше не потрібно запускати цю команду.
Кріс Пітерс

7

Мені потрібно було використати цей самоцвіт:

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.


4

У моєму випадку активи, скомпільовані відповідно до наведених вище інструкцій, але він не вибирав завантажувальний гліфікон "fontawesome-webfont", тому це нарешті спрацювало для мене, витративши стільки годин на дослідження.

Файл самоцвіту

gem 'rails_12factor', group: :production

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

config / 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

довкілля / виробництво.рб

config.serve_static_assets = true

Потім, нарешті, я побіг rake assets:precompile RAILS_ENV=productionі штовхнув його до героку, і це вдалося.


1
Я вважаю, що rails_12factor робить частину config.serve_static_assets.
justingordon

3

Це було проблемою з Heroku Ruby Buildpack, але оновлення було розгорнуто сьогодні (21.05.2013). Будь ласка, спробуйте і повідомте нам.

Щоб відповісти на ваші запитання:

# 1) Це вихід зірочок; речі компілюються, /tmpа потім переміщуються (Дивіться тут у Зірочках ). Наскільки мені відомо, це завжди робилося таким чином, але лише після оновлення версії зірочок у Rails ми отримали цей новий вивід налагоджувального типу.

# 2) Раніше assets:precompileстворений manifest.jsonфайл, але тепер у Rails 4 у ​​файлі маніфесту є відбиток пальця, який раніше не виявлявся. Це було виправлено за допомогою # 74 .


2

Я додав це у верхній частині одного з моїх файлів css.scss у папці resources / stylesheets /.

@import "font-awesome";

потім побіг ..

rake assets:clean

і ...

rake assets:precompile RAILS_ENV=production

2

У 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 робить це за вас під час розгортання. Також вам не доведеться попередньо складати активи в розробці та підштовхувати їх до героку.


1

Окрім того, що ви встановили самоцвіт 'rails_12factor', єдине, що вам потрібно зробити, це це.

# config/application.rb

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

Здається, хоча Rails точно знає, чого хоче, Героку потрібно нагадати про те, щоб включити папку активів як частину шляхів до активів.


1

Використовуйте розширення зображень

У мене була така сама проблема, але з іншої причини.

Замість

<%= asset_path 'facebook-link' %>

Використання:

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

Поки перший працював локально, коли я натиснув на Героку, мої зображення ламалися, і я не мав уявлення, чому. Використання повного розширення файлу вирішило проблему :)



0

Якщо ви використовуєте конкретні ресурси контролера, як у:

 <%= 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

0

Думаю, я додаю це як відповідь, оскільки це запитання пов’язане зі сторінкою підтримки Heroku, якщо ви шукаєте "assets".

Це здебільшого для людей, які оновлюють свій додаток до Rails 4, але після проходження цього - та багатьох інших публікацій SO - що, нарешті, змусило мене змінити таке production.rb:

config.action_dispatch.x_sendfile_header = "X-Sendfile"

Кому:

config.action_dispatch.x_sendfile_header = nil

Я не вловлював цього, коли оновлювався, і, як зазвичай, це зайняло мене назавжди, щоб зрозуміти. Сподіваємось, це допоможе комусь іншому! Викрикуючи до PatrickEm побажали / відповів те ж саме в своєму питанні .


0

Це може не відповісти на першопричину вихідного питання, але у мене був подібний симптом з іншою першопричиною.

Попередня компіляція файлів JPEG змінює розширення файлу на JPG, що означає, що asset_path("my_image.jpeg")іasset_path("my_image") не працює. Видаліть "e" з JPEG і вуаля, це працює.

Інші описували ту ж проблему тут https://blazarblogs.wordpress.com/2016/04/06/rails-force-to-precompile-jpeg-to-jpg/

Це помилка? Або бажана поведінка? І також дивно, що це лише не працює в моєму виробничому середовищі, розміщеному на Heroku. Можливо, вони мають якусь конфігурацію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.