Rails 4 - 在生产服务器上预编译资产后没有 manifest.json
Posted
技术标签:
【中文标题】Rails 4 - 在生产服务器上预编译资产后没有 manifest.json【英文标题】:Rails 4 - NO manifest.json after assets precompile on production server 【发布时间】:2015-06-18 20:38:17 【问题描述】:这里是 Rails 4.2 应用的 app/assets/。
有 3 个引导 js 和 css 文件。部署到生产环境(ubuntu 12.1)后,资产预编译在服务器上完成(部署在 suburi 下):
RAILS_ENV=production bundle exec rake assets:precompile RAILS_RELATIVE_URL_ROOT=/mysuburi
这里是production.rb
:
config.cache_classes = true
config.eager_load = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.serve_static_files = false #ENV['RAILS_SERVE_STATIC_FILES'].present?
config.assets.compress = true
config.assets.js_compressor = :uglifier
config.assets.compile = false
config.assets.digest = true
config.log_level = :debug
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.log_formatter = ::Logger::Formatter.new
config.active_record.dump_schema_after_migration = false
这是application.css.scss
的头:
@import "bootstrap.min.css";
@import "bootstrap-theme.min.css";
@import "simple_form.css.scss";
@import "user_menus.css.scss";
在application.js
,它有:
//= require bootstrap.min
这是生产服务器上公共/资产/ls
的输出:
application-05cf37813d76c2bd659271403789374cc118f1a4e616ec220969577b79ff6514.css
application-375b4b5d8fc285716f4fdca966aa960912efe8292242df8f1a60b99d5caa4b02.js
authentify
banquet_coursex
banquetx
biz_workflowx
commonx
glyphicons-halflings-regular-5d234508037dc13a419ef6ce48f3fc73dbb477f1a162c052b872182b494e626e.svg
glyphicons-halflings-regular-bd18efd3efd70fec8ad09611a20cdbf99440b2c1d40085c29be036f891d65358.ttf
glyphicons-halflings-regular-f495f34e4f177cf0115af995bbbfeb3fcabc88502876e76fc51a4ab439bc8431.eot
glyphicons-halflings-regular-fc969dc1c6ff531abcf368089dcbaf5775133b0626ff56b52301a059fc0f9e1e.woff
jquery-ui
searchx
state_machine_logx
user_manualx
user_menus-7c46e17f4172c2a954eeaf85e80b4e030d1ed0fb3927288bbe07eeb4fb8cbfc5.css
通过与其他 Rails 应用程序比较,它在 /assets 下缺少 manifest.json
。我们在config/environment/production.rb
中尝试了各种配置选项,但无济于事。唯一适用于生产服务器的选项是实时编译config.assets.compile = true
(不推荐)。我们的代码有什么问题导致资产预编译失败?
更新:我们从头开始重新构建了 Rails 应用程序,资产问题仍然存在。正如我们所怀疑的,这个资产预编译问题可能与config/production.rb' and 'config/initializers/aseets.rb
中的设置无关。 bundler
和 rake
的回滚版本没有帮助。在同一生产服务器上运行的另一个 Rails 4.2 应用程序中使用了相同的引导 css 和 js 文件,没有问题。
【问题讨论】:
我们不必为侧面应用程序/资产中的资产执行config.assets.precompile += ['bootstrap.min.js', 'b...
。除非宣言中没有指定,否则这只需要外部资产。
@maximus
,是的,不包括 assets.rb
中明确包含的那些 css 或 js 文件是我们为另一个具有完全相同 css 和 bootstrap 资产的 Rails 4.2 应用程序所做的。但不是这个应用程序。如果这些引导 js/css 不包括在内,那么在资产预编译后它们根本不会被指纹识别。
这个问题你查了吗***.com/questions/21519040/…
@ Mauricio Gracia
,是的,但这个问题可能不同。在我们的例子中,资产预编译没有错误。该问题仅在登录网站并打开页面时显示。此外,如果在production.rb
中设置config.assets.compile = true
(所谓的实时编译。可能性能较差),则资产在页面上正确显示。
让我来一一提出问题:1.您使用什么流程进行部署?
【参考方案1】:
如果您使用的是链轮3.x
,清单文件现在命名为.sprockets-manifest-md5hash.json
,它在Upgrading Guide中注明
【讨论】:
为了清楚一点,在上面的路径名中,md5hash
是自动生成的哈希,看起来像da5c11 etc etc
【参考方案2】:
我假设您在应用程序 html 模板中明确包含这些 JS 和 CSS 文件?
它们不会神奇地最终编译到主应用程序的 CSS 和 JS 文件中,您需要确保在从 HTML erb 文件中引用它们时使用标签助手,而不是直接路径。
如有疑问,请使用asset_path。
【讨论】:
是的,Rails 应用程序包含它们。【参考方案3】:manifestxxx.json 文件是在 sprockets
版本从 3.2.0 回滚到 2.12.3 后生成的。该问题是由用于预编译资产的 gem sprockets
的太新版本引起的。
【讨论】:
以上是关于Rails 4 - 在生产服务器上预编译资产后没有 manifest.json的主要内容,如果未能解决你的问题,请参考以下文章
如何刷新Rails / Sprockets以在资产之后了解生产服务器上的新清单:预编译
Rails 4 - 生产资产:预编译导致 ActiveRecord::NoDatabaseError: FATAL: database does not exist