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 assets:precompile,但这会在 public/assets 中生成 manifest-xxxxxx.json,而不是 manifest.yml,因此 heroku 不会检测到 JSON 清单文件。我通过从 json 文件手动创建一个 yml 来整理它,heroku 变得很高兴。heroku 的方法已经过时了吗?
4

16 回答 16

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 入门指南。

更新 (07/22/2013):Heroku 现在提供不同的 gem 来预编译资产。

group :production do
  gem 'rails_12factor'
end
于 2013-05-15T17:34:46.213 回答
33

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

SampleApp::Application.configure 做
  .
  .
  .
  config.serve_static_assets = true
  .
  .
  .
结尾

更新:

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

config.serve_static_files = true 
于 2013-05-21T21:48:40.420 回答
16

由于rails 4 将 manifest.yml 替换为 manifest-(fingerprint).json,您需要启用静态资产服务。

Heroku 上的 Rails 4.x 入门

gem 'rails_12factor', group: :production

然后

bundle install

最后,

git push heroku

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

于 2013-06-29T00:42:13.513 回答
14

我遇到了同样的问题。

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

因此,在添加 heroku 支持之前,这是一个临时解决方案。

于 2013-03-16T11:33:11.957 回答
13

经过数小时的谷歌搜索,Heroku 上的指南或 StackOverFlow 上的建议都没有帮助我,我终于遇到了这篇博客文章,它提供了这个线索:

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

如果没有这个,资产管道将始终尝试初始化整个应用程序并连接到数据库(尽管您可能已经阅读过 Rails 4 现在不再这样做的所有内容)。这会将您的 Heroku 配置暴露给 Rails,因此它可以成功启动并运行诸如 assets:precompile 之类的 rake 任务。

于 2013-08-31T07:33:54.710 回答
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,除其他外。

于 2014-07-24T17:54:08.920 回答
4

就我而言,资产是按照上面的说明编译的,但它没有选择引导 glyphicons 'fontawesome-webfont',所以在浪费了这么多小时的研究之后,这终于对我有用了。

宝石文件

gem 'rails_12factor', group: :production

捆绑安装

配置/应用程序.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,这很奏效。

于 2013-07-24T11:43:41.587 回答
3

这是 Heroku Ruby Buildpack 的一个问题,但今天(2013-05-21)部署了更新。请尝试一下并告诉我们。

要回答您的问题:

#1) 这是链轮输出;东西被编译/tmp然后移动(见这里 Sprockets)。据我所知,这一直是这样做的,但直到 Sprockets 版本在 Rails 中更新,我们才得到这个新的调试类型输出。

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

于 2013-05-21T14:47:33.783 回答
2

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

@import "font-awesome";

然后跑了。。

rake assets:clean

和...

rake assets:precompile RAILS_ENV=production
于 2013-11-08T19:22:09.343 回答
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:precompileheroku 在部署期间会为您执行此操作。此外,您不必在开发中预编译资产并将它们推送到 heroku。

于 2015-11-06T20:09:09.710 回答
1

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

# config/application.rb

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

似乎尽管 Rails 确切地知道它想要什么,但 Heroku 需要提醒将资产文件夹包含在资产路径中。

于 2014-11-11T00:51:22.277 回答
1

使用图片扩展

我有同样的问题,但出于不同的原因。

代替

<%= asset_path 'facebook-link' %>

利用:

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

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

于 2016-04-25T15:39:22.957 回答
1

添加此宝石gem 'rails_serve_static_assets'

https://github.com/heroku/rails_serve_static_assets

于 2016-06-15T19:16:08.907 回答
0

我想我会添加这个作为答案,因为如果你搜索这个问题是从 Heroku 支持页面链接的"assets"

这主要适用于将他们的应用程序更新到 Rails 4 的人,但是在经历了这个 - 以及许多其他 SO 帖子之后 - 最终让我改变了以下内容production.rb

config.action_dispatch.x_sendfile_header = "X-Sendfile"

至:

config.action_dispatch.x_sendfile_header = nil

当我升级时我没有发现这个问题,像往常一样,这让我花了很长时间才弄清楚。希望它可以帮助别人!向在他的问题中提出/回答相同问题的PatrickEm 大声喊叫。

于 2014-09-01T22:47:16.523 回答
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
于 2014-06-08T22:48:13.970 回答
0

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

JPEG文件的预编译将文件扩展名更改为JPG,这意味着它asset_path("my_image.jpeg")不起作用asset_path("my_image")。从 JPEG 中删除“e”,瞧,它可以工作了。

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

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

于 2018-01-01T13:26:55.320 回答