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 = production bundle exec rake asset:precompile,但是这会在public / assets中而不是manifest.yml中生成manifest-xxxxxx.json,因此heroku不会检测到JSON清单文件。我通过从json文件手动创建一个yml进行了整理,heroku感到高兴。heroku的方法是否过时了?

1)有人正在调查
Catsby 2013年

2)在rails 4中发生了变化,有一个拉动请求到buildpack进行更新
catsby 2013年

@ctshryock对此有任何更新吗?
Tadas T

清单问题有github.com/heroku/heroku-buildpack-ruby/pull/74。今天,我会就/ tmp /问题向人们请教,仍然会发生吗?
catsby 2013年

@ctshryock是的,很不幸,它仍在发生...感谢您的适当贡献...
Boti

Answers:


102

Herrail的资产插件不再可用,因为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入门指南

更新(2013年7月22日):Heroku现在提供了不同的gem来预编译资产。

group :production do
  gem 'rails_12factor'
end

14
这对我来说不是必需的。只需遵循@以色列巴尔巴(Israel Barba)的回答将其更改config.serve_static_assets = falsetrue
Matt De Leon

2
我以前是那样做的,但是我相信,如果那样做,则必须预先编译资产并自己提交。那还正确吗?
Joseph Ravenwolfe13年

它无需预编译即可工作。在某些情况下,我没有抓住我是没有用的(我只有一个简单的样式表)
Matt De Leon

2
这是行不通的。预编译也不会。对我们来说,资产流水线在heroku上的第4条轨道上中断了,我们浪费了大量时间,回到ec2-牢骚牢骚。
2013年

4
您是否在CSS和其他地方使用asset_path()帮助器?通过“ /assets/filename.jpg”引用资产在Heroku上也不起作用。
2013年

33

您需要配置Rails以在生产环境中提供静态资产:config / environments / production.rb

SampleApp :: Application.configure做
  。
  。
  。
  config.serve_static_assets = true
  。
  。
  。
结束

更新:

在Rails 4中已弃用,并已通过以下方式进行了更改:

config.serve_static_files = true 

1
我还必须删除我的public / assets文件夹,因为这些文件是由我团队中的其他人在本地预编译的,检入GitHub并覆盖了Heroku的资产编译过程。
user1515295

16

由于Rails 4用manifest-(fingerprint).json替换了manifest.yml,因此您需要启用静态资产服务。

Heroku上的Rails 4.x入门

gem 'rails_12factor', group: :production

然后

bundle install

最后,

git push heroku

为我解决了此问题。希望这可以帮助!


1
这是他们在正式文件上所说的,但是对其他人有用吗?我在我的gemfile上有此文件,而javascript文件似乎仍然没有对其进行预编译
Maximus

1
我已经做了一切:gem'rails_12factor',group::production config.serve_static_assets = true config.assets.precompile + =%w(* .css * .js)我的js和css文件位于vendor / assets /下。当我部署到heroku时,一切看起来都很好:运行:rake asset:precompile资产预编译完成(310.44s)当我看到application-5c84e59d83c00fd13fb659edc18db24a.js时,它都是空的你知道我在做错什么吗?
亚历山大·吉拉尔多

这对我不起作用。config.serve_static_assets = true表示css开始正确提供服务,但图像或JS无法正确提供服务。
Alex Lynham

这对我有用,感谢@voss提供的最新答案。Heroku已用rails_12factor替换了rails_log_std_out和rails3_serve_static_assets。
亚伦·格雷

您如何引用图像?我试过了background-image:url('/ public / assets / starsw600.jpg'); 只是('starsw600.jpg')。尚未尝试使用config.serve_static_assets和('starsw60xxxxxx.jpg)的所有组合。
flobacca

14

我遇到了同样的问题。

我在我的environment / production.rb文件中设置config.serve_static_assets = true,直到heroku不支持新的清单格式。

因此,这是一个临时解决方案,直到将添加heroku支持。


那行不通。Heroku的注入是正是这么做的:即它不会工作,最好的解决方案至今:复制的manifest.json到manifest.yml(无转换需要)向Heroku的欺骗检测预编译的资产。
2013年

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,因此它可以成功启动并运行rake任务,例如asset:precompile。


终于有事了。它说此功能是实验性的,可以随时删除。
tmartin314

10
“没有这样的功能:user-env-compile”
Andreas Baumgart 2014年

它不再是实验室功能,而是默认包含在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

环境/生产.rb

config.serve_static_assets = true

然后终于,我跑去 rake assets:precompile RAILS_ENV=production把它推到了heroku上,那行得通。


1
我相信rails_12factor可以执行config.serve_static_assets部分。
justingordon 2014年

3

这是Heroku Ruby Buildpack的问题,但今天已部署了更新(2013-05-21)。请尝试一下,让我们知道。

要回答您的问题:

#1)这是链轮的输出;东西被编译到/tmp然后移动(参见Sprockets此处)。据我所知,这始终是通过这种方式完成的,但是直到在Rails中更新了Sprockets版本之后,我们才得到了这个新的调试类型的输出。

#2)以前assets:precompile生成了一个manifest.json文件,但是现在在Rails 4中,清单文件中有一个指纹,以前没有检测到。该问题已由#74修复。


2

我将此添加到assets / stylesheets /文件夹中我的css.scss文件之一的顶部。

@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 gem,也会收到警告。

如果资产问题,请登录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的部署过程中可以实现这个要求。另外,您不必预先编译开发中的资产并将其推送到heroku。


1

除了确保安装了“ rails_12factor” gem之外,您唯一需要做的就是这样做。

# config/application.rb

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

看起来,尽管Rails确切知道了它想要什么,但是Heroku需要提醒您将资产文件夹作为资产路径的一部分。


1

使用图像扩展

我遇到了同样的问题,但原因有所不同。

代替

<%= asset_path 'facebook-link' %>

使用:

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

当第一个在本地工作时,当我推到Heroku时,我的图像破裂了,我不知道为什么。使用完整文件扩展名解决了问题:)



0

如果您正在使用控制器特定的资产,例如:

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

然后,在生产中,您将需要显式地进行预编译(在开发轨道中,动态地编译文件)。

请在此处查看正式的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

升级时,我没有发现这个问题,而且像往常一样,这需要我一辈子找出来。希望它可以帮助其他人!向帕特里克·埃姆大喊大叫帕特里克·埃姆问/回答了他的问题


0

这可能无法回答原始问题的根本原因,但是我有类似的症状,但根本原因不同。

的JPEG文件预编译文件扩展名更改为JPG,也就是说,asset_path("my_image.jpeg")asset_path("my_image")没有工作。从JPEG和voila中删除“ e”,即可使用。

其他人在这里描述了相同的问题https://blazarblogs.wordpress.com/2016/04/06/rails-force-to-precompile-jpeg-to-jpg/

这是一个错误吗?还是期望的行为?而且奇怪的是,它仅在我的Heroku托管的生产环境中不起作用。也许他们有某种配置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.