【问题标题】:Assets say "not precompiled" when they are precompiled资产在预编译时说“未预编译”
【发布时间】:2011-11-30 05:55:29
【问题描述】:

好的,当我尝试使用资产管道时出现此错误。我不明白是什么原因造成的。

Sprockets::Helpers::RailsHelper::AssetPaths::AssetNotPrecompiledError in Photos#show

Showing .../app/views/photos/_photo_view.html.haml where line #2 raised:

jquery.autocomplete isn't precompiled

Extracted source (around line #2):

1: - content_for :scripts do
2:  = javascript_include_tag 'jquery.autocomplete'

但是,这是预编译的。我在启动服务器之前运行了rake assets:precompile RAILS_ENV=production,在我的public/assets 目录中我有文件:jquery-5550a245a55b28927b5552cac182e612.autocomplete.js 以及.js.gz,它准确地反映在清单中:

#manifest.yml
---
application.js: application-4277323e3f7506b71f45c71e8a3a7c8f.js
jquery.autocomplete.js: jquery-5550a245a55b28927b5552cac182e612.autocomplete.js
jquery.cycle.all.min.js: jquery-183ef696b43944deaee5778d3094dbdd.cycle.all.min.js
jquery.fancybox.js: jquery-e52e44b2b4fb349bade9beb91461a810.fancybox.js
jquery.plupload.queue.js: jquery-f2e7f6ad7d2e5ca50235ed21f8d573cc.plupload.queue.js
jquery.tools.js: jquery-c53e304240fa56767fe0f2a00cb4bceb.tools.js
plupload.full.js: plupload-5dd26ee3fff6b627c19f196e9d1429dd.full.js
application.css: application-ce5217e1714cbc4e9c3ff6c5dfc9b221.css
fancybox.css: fancybox-9ee9c36f391086e4b0629b7df4042390.css
jquery.plupload.queue.css: jquery-661fbf3f503aa32ff11c004838c0820b.plupload.queue.css
jquery.js: jquery-4d23f0cfea862f56deb04f0a8ab1fcee.js
jquery.min.js: jquery-8a50feed8d29566738ad005e19fe1c2d.min.js

有问题的 javascript 文件未加载到我的 application.js 文件中,因为我只需要在一个视图中使用它,并且不会在应用程序的其他任何地方使用它。为了解决这个问题(并修复试图编译 sass 部分的链轮),我配置了我的预编译正则表达式,如下所示:

#environments/production.rb
config.assets.precompile = [/^[a-zA-Z]*\..*/]

(上述正则表达式预编译任何以字母字符开头的文件,并忽略以下划线等非字母字符开头的文件)。

有没有人了解造成这种情况的原因以及如何解决?资产管道让我大吃一惊!

更新

刚刚发现 Rails.configuration.assets.digests 在生产中返回 nil。也许问题就在那里,由于某种原因 sprockets 没有找到 manifest.yml。

我可能弄错了,但似乎 sprockets 在查找 manifest.yml 时没有使用配置中的 assets_host。

https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/sprockets/railtie.rb#L38

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 asset-pipeline sprockets


    【解决方案1】:

    将.js 添加到

    javascript_include_tag 'jquery.autocomplete.js'

    似乎缺少功能。当文件名有句点'.'在名称中,查看摘要时不会添加 .js 扩展名。

    我对@9​​87654324@ 进行了一些调试,似乎digest_for 方法在没有.js 的情况下获得了逻辑路径。

    【讨论】:

    • 感谢您的回答,这让我免于烦恼
    • 对我有用,尽管我的文件名没有句点:supersleight.js isn't precompiled <%= javascript_include_tag 'supersleight' %> 尽管 supersleight-d7d35147a0247a59d432bbe763e54a1a.js 已编译并位于 public/assets/ 文件夹下。我在application.rb 下添加了config.assets.precompile << 'supersleight.js'。 config.assets.compile = false 也是。
    【解决方案2】:

    我自己一直在努力解决这个问题,尽管设置了config.assets.compile = false,因为我怀疑上面的示例是将标志设置为true。

    Cannot configure assets via pipeline on local production rails 3.1.3 server

    正如 UberNeet 所建议的那样,我的观察结果归结为 Sprockets 2.0.3 的错误。解决方法是从资产名称中删除句点,或者将其作为清单的一部分,而不是直接链接到它。

    错误报告在这里:https://github.com/rails/rails/issues/3398

    查看您上面的问题,并结合我过去两天的经验,我怀疑在设置 config.assets.compile = true 时存在与资产命名相关的问题。这个问题可能源于资产命名 - 你的清单有 jquery.autocomplete 库编译为:

    jquery-5550a245a55b28927b5552cac182e612.autocomplete.js
    

    但是当你通过 rake 使用 rake assets:precompile 预编译这些资产时,我相信它们实际上被编译为:

    jquery.autocomplete-5550a245a55b28927b5552cac182e612.js
    

    可能是这种差异导致了您提到的问题。可能也值得为此提出另一个 github 问题,尽管上面列出了解决方法,而且我知道 Rails 3.2 将使用 Sprockets 2.1.0,它可能已经包含此问题的修复程序。

    【讨论】:

    • 我想就是这样。我的错误最终消失了,但我一直不明白为什么——在某些时候我改变了文件结构,它似乎神奇地消失了,现在我想我知道为什么了。
    【解决方案3】:

    请注意,以前在 application.js 中不需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多