【问题标题】:Make asset pipeline act like production on development使资产管道像开发中的生产一样
【发布时间】:2012-04-18 14:59:34
【问题描述】:

我在生产 上遇到了一些资产问题:缺少资产、编译到错误文件中的东西(“/admin”的 JavaScript 被编译到前端代码等等)。大多数资产来自引擎。我想对此进行调试和优化。

为此,我需要在我的开发环境上进行预编译、服务和失败,就像在生产环境上一样。

我在config/development.rb 中添加了一些行:

  config.serve_static_assets = true
  config.assets.precompile += %w( store/all.js store/all.css admin/all.js admin/all.css ) # @TODO: clean up, and optimize.
  config.assets.compile = false

使用rake RAILS_GROUPS=assets RAILS_ENV=development assets:precompile 运行它会给我所有资产和public/ 中的manifest.yml

但是随后服务器出现故障:

Sprockets::Helpers::RailsHelper::AssetPaths::AssetNotPrecompiledError in Spree/home#index

Showing /xxxx/app/views/spree/shared/_head.html.erb where line #13 raised:

favicon.ico isn't precompiled

favicon.ico 未预编译。但它是!它在公共目录中的manifest.yml 中,我可以使用浏览器(或 wget)获取它:http://localhost:3000/assets/favicon.ico

注意 Favicon 只是调用的第一个资产。如果我去掉 favicon,问题就会出现在下一个资产上,即“all.js”,或者,当它被剥离时,“all.css”等等。我可以剥离它直到“footer_bg.png”,然后它会在那里失败。再说一遍:问题不在于网站图标,而在于 开发 环境根本看不到预编译的资产。

还需要什么才能获得类似于 productiondevelopment 资产管道?

编辑:更明确的解释是网站图标不是问题,只是一种症状。

【问题讨论】:

  • 您的生产环境堆栈是什么?单服务器/多服务器、Apache/Nginx、Heroku?您是否使用 capistrano 进行部署并使用 capistrano 配方?您在生产中使用 config.serve_static_assets = true 吗?您是否尝试过按照 Rails 的建议通过 apache/nginx 而不是在 Rails 中处理serve_static_assets?
  • 我的生产堆栈几乎是一个黑盒乘客。这是一个site5虚拟主机。我没有使用 capistrano 进行部署,而是使用 git-push && post-commit 钩子(又名 git-deploy)进行部署。 config.serve_static_assets = true 已禁用。我尝试过通过 Apache 提供资产,是的。解决的很少。作为我在这里尝试解决的问题,我的 开发 环境没有像生产环境那样为我的资产提供服务。

标签: ruby-on-rails-3 asset-pipeline


【解决方案1】:

我最终在 localhost 上安装了一个 apache,乘客进行故障排除。

由于静态资产服务,Apache(可能是任何可载客的服务器)。 此外,在 localhost 上,我可以将 apache 在其日志中的详细程度提高到非常高,从而为我提供足够的调试信息。

Passenger 尽可能在生产环境中模拟 ruby​​ 版本和 gem 加载。

在 webrick 上运行实在是太不一样了,即使在尽可能接近的情况下,它也被证明与生产堆栈太不同了;这就是为什么我无法重现那里的生产问题,

像生产环境一样启动整个堆栈使我能够进行故障排除。这使我得出结论,有几个问题导致了资产问题:宝石资产没有被提取;权限问题(www-data 无法读取已编译的资产)和一些未正确编译的资产。

【讨论】:

    【解决方案2】:

    我想你可能想把favicon.ico留在public...

    alzabo0:~ $ rails --version
    Rails 3.2.3
    alzabo0:~ $ rails new ojoijoijo
    [...]
          create  public/404.html
          create  public/422.html
          create  public/500.html
          create  public/favicon.ico
          create  public/index.html
          create  public/robots.txt
    [...]
    

    【讨论】:

    • 也许吧。但那是无关紧要的。问题不是 favicon.ico,问题是我的开发环境。不会像我想要的那样识别已编译的资产。而且由于我选择通过资产管道运行 favicon(长话短说),它是包含的第一个文件,并且只是资产管道阻塞的一个示例。如果我按照您的建议将网站图标移出管道,则资产管道将在某些 css 或 js 文件上进一步阻塞几行。
    【解决方案3】:

    只是猜测,但请尝试添加到您的预编译列表中:

    config.assets.precompile += %w( store/all.js store/all.css admin/all.js admin/all.css favicon.ico)
    

    【讨论】:

    • 确实有效。奇怪的是,在生产中这是不需要的。由于这条线是我想要清理、修复和优化的主要内容之一,因此这正是应该“就像在生产中一样”的部分。
    • 确实很奇怪。也许在生产中,如果你“rake assets:clean”它突然也不会在那里工作?您如何在视图模板中引用 favicon.ico?就个人而言,我不使用帮助程序来生成 favicon.ico 链接。您正在使用 favicon_link_tag 吗?这是一个很奇怪的事情,也许现在把它留在开发中,然后继续有趣的部分?
    • 请注意,favicon 不是问题。问题是我的开发环境在预编译时无法识别资产。 Favicon 只是一个例子。当我离开 favicon 时,问题仍然存在,并且会出现在下一个资产中:js 或 css 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2011-12-26
    • 2012-01-23
    • 2013-12-02
    相关资源
    最近更新 更多