【发布时间】:2014-01-30 16:12:48
【问题描述】:
在使用 Ruby 2.0 和 Rails 4.0 时,我在资产管道上看到了不同的行为,我不知道为什么。这是它的要点......
我的 ./app/assets/javascripts 文件夹中有一个 application.js.coffee 和 google_analytics.js.coffee 文件。
在我的 app/views/layouts/application.html.haml 中,我有以下两行:
= javascript_include_tag "application"
= javascript_include_tag "google_analytics"
部署到生产环境后,这会在呈现的页面中生成以下内容:
<script src="/assets/application-f15feb4200e0d1db4963a00b28fbe9ca.js"></script>
<script src="/javascripts/google_analytics.js"></script>
请注意,application 包含按预期编译到资产管道中,而 google_analytics 脚本则没有。
在开发模式下,一切都是从资产管道提供的,没有预期的指纹:
<script src="/assets/jquery.js?body=1"></script>
<!-- several other includes suppressed for brevity here -->
<script src="/assets/application.js?body=1"></script>
<script src="/assets/google_analytics.js?body=1"></script>
我还检查了生产部署并注意到google_analytics 没有经过预编译和指纹识别。
编辑:得到下面的 cmets 和答案后,将以下内容添加到 config/environments/production.rb 并尝试另一个部署:
ComingSoon::Application.configure do
config.serve_static_assets = false
config.assets.js_compressor = :uglifier
config.assets.compile = false
config.assets.digest = true
config.assets.version = '1.0'
config.assets.precompile += ['google_analytics.js.coffee']
end
为什么 sprockets 资产管道没有像 application script 那样预编译 google_analytics 脚本并提供它?我该如何解决这个问题?
【问题讨论】:
-
你是如何检查谷歌脚本没有被预编译的?如果它在您的资产文件夹中并且您有 //= require_tree 。在您的 application.js 中,它肯定应该被编译。
-
它在 application.js.coffee 中不是必需的,并且作为一般规则,我不做“require_tree”——它是独立的,因为我只想在有条件的生产中包含它包括。即 "= javascript_include('google_analytics") if Rails.env == 'production'" 为了检查它是否没有预编译,我注意到它在 cap 生产部署期间没有为此文件发出消息,但其他资产确实发出了消息,并且我还登录到生产环境检查 public/assets 文件夹,它也不见了。
标签: ruby-on-rails ruby-on-rails-4 sprockets