【问题标题】:"Command failed with status ()" when precompiling assets预编译资产时“命令失败并显示状态 ()”
【发布时间】:2013-02-06 03:12:49
【问题描述】:

在他们的生产机器上编译资产时,我遇到了与许多用户类似的问题。唯一的区别是我无法从跟踪中得到任何提示来解决问题。

rake assets:precompile RAILS_ENV=production --trace
** Invoke assets:precompile (first_time)
** Execute assets:precompile
/usr/local/rbenv/versions/1.9.3-p362/bin/ruby /usr/local/rbenv/versions/1.9.3-p362/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets --trace
** Invoke assets:precompile:all (first_time)
** Execute assets:precompile:all
** Invoke assets:precompile:primary (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
** Invoke environment (first_time)
** Execute environment
** Invoke tmp:cache:clear (first_time)
** Execute tmp:cache:clear
** Execute assets:precompile:primary
rake aborted!
Command failed with status (): [/usr/local/rbenv/versions/1.9.3-p362/bin/r...]
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils.rb:53:in `block in create_shell_runner'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils.rb:45:in `call'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils.rb:45:in `sh'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils_ext.rb:39:in `sh'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils.rb:80:in `ruby'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/file_utils_ext.rb:39:in `ruby'
/home/app/application/ruby/1.9.1/gems/actionpack-3.2.12/lib/sprockets/assets.rake:12:in `ruby_rake_task'
/home/app/application/ruby/1.9.1/gems/actionpack-3.2.12/lib/sprockets/assets.rake:21:in `invoke_or_reboot_rake_task'
/home/app/application/ruby/1.9.1/gems/actionpack-3.2.12/lib/sprockets/assets.rake:29:in `block (2 levels) in <top (required)>'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/task.rb:205:in `call'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/task.rb:205:in `block in execute'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/task.rb:200:in `each'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/task.rb:200:in `execute'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/task.rb:158:in `block in invoke_with_call_chain'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/task.rb:151:in `invoke_with_call_chain'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/task.rb:144:in `invoke'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/application.rb:116:in `invoke_task'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/application.rb:94:in `block (2 levels) in top_level'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/application.rb:94:in `each'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/application.rb:94:in `block in top_level'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/application.rb:88:in `top_level'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/application.rb:66:in `block in run'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
/usr/local/rbenv/versions/1.9.3-p362/lib/ruby/1.9.1/rake/application.rb:63:in `run'
/usr/local/rbenv/versions/1.9.3-p362/bin/rake:32:in `<main>'
Tasks: TOP => assets:precompile

实际上没有状态码,只有失败。如果我直接或通过bundle exec 调用rake 也没有任何区别。

关于环境 带有全局 rbenv 安装的 debian 挤压盒(/usr/local/rbenv 就像您从跟踪中看到的那样)。 Ruby 1.9.3 2012-12-25 补丁级别 362。

对此有何提示/想法?

【问题讨论】:

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


    【解决方案1】:

    我将自己回答这个问题,因为我或多或少可以解决它。如果有人有补充,请不要犹豫,写一个自己的答案或评论这个答案/问题。

    到目前为止我发现了什么:

    如果您通过例如编译主要资产 (assets:precompile:primary) 或显式调用 assets:precompile:all 来玩弄 assets:precompile,您最终可能会得到有关问题根源的提示。就我而言,我在public/tmp/ 上都遇到了Errno::EACCES。不知何故未显示,因此请确保您的用户拥有在那里创建/删除文件和文件夹的完全权限。

    就我而言,它有时会起作用,因为我已经关闭了 rails 应用程序并在它关闭时进行了预编译。由于预编译会分配大量内存,因此我进行了一些试验和错误,最终在 rake 尝试执行 asstes:precompile:primary 时得到了已知的 Killed 消息。由于使用了太多内存,该任务被简单地终止了。

    另一个问题是 sprockets 在预编译时找不到 bootstrap 将其放入资产管道。将gem 'bootstrap' 移出group :assets 解决了这个问题。这也是我在玩命令时得到的提示。

    解决这个问题的最佳方法——或者更好的方法:变通——这个问题是简单地在本地编译你的资产。只需将rake assets:precompile RAILS_ENV=development 放入您的终端,然后部署public/assets请记住在部署后在您的开发环境中删除该文件夹,否则您将最终调试为什么您对app/assets/* 的更改在开发中没有生效。 至少这对我有用(tm)。

    或者,增加交换分区也可能有效。但是,在需要使用 swap 的 VPS 上编译可能需要一段时间,所以我会坚持使用本地方式。

    【讨论】:

    • 关于进程被操作系统杀死的说法是正确的
    【解决方案2】:

    我也有同样的问题。 我通过添加交换来修复它(在我的情况下,我的服务器上可用 512RAM 为 1gb)

    【讨论】:

    • 有同样的问题。在 digitalocean 托管和 512RAM 上的 Ubuntu 64 位中,对于捆绑程序来说非常小。将其更改为 32 位或 1024RAM 即可正常工作。
    【解决方案3】:

    在您的资产正在编译时尝试运行 htop 以查看您的 RAM 是否用完。添加交换为我修复了它。

    请参阅本指南以添加交换:https://www.digitalocean.com/community/articles/how-to-add-swap-on-ubuntu-12-04

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      相关资源
      最近更新 更多