“预编译资产时,命令失败,状态为()”

在生产高效的盒子上编译资产时,我遇到了类似很多用户的类似问题。 唯一的区别是我无法从跟踪中得到任何提示来解决问题。

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 ' /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 `' Tasks: TOP => assets:precompile 

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

关于环境 debian挤压盒与全局rbenv安装( /usr/local/rbenv ,你可以从跟踪中看到)。 Ruby 1.9.3 2012-12-25 patchlevel 362。

有关此的任何提示/想法?

我自己会回答这个问题因为我可以或多或少地解决它。 如果有人有添加内容,请不要犹豫,写下自己的答案或评论此答案/问题。

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

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

在我的情况下,它有时工作,因为我已关闭rails应用程序并在它关闭时进行预编译。 由于预编译分配了大量内存,我做了一些试验和错误,最终在rake尝试执行asstes:precompile:primary时得到了已知的Killed消息asstes:precompile:primary 。 由于使用了太多内存,任务就被杀死了。

另一个问题是sprockets在预编译时无法找到bootstrap将其放入资产管道中。 在group :assets外移动gem 'bootstrap' group :assets解决了这个问题。 当我玩这些命令时,这也是我所暗示的。

解决的最佳方法 – 或者更好:解决方法 – 这个问题就是简单地在本地编译资产。 只需抛出一个rake assets:precompile RAILS_ENV=development到您的终端,然后部署public/assets请记住在部署之后在开发环境中删除该文件夹,否则您将最终调试app/assets/*上的更改未在开发中生效的原因。 至少这对我有用(tm)。

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

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

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

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