部署 assets:precompile 时间过长

xiaoxiao · 2014年06月11日 · 最后由 cgg5207 回复于 2014年06月22日 · 3011 次阅读

项目部署在阿里云上,由于阿里云上如果长期不操作的话会自动掉线,这样我在部署的时候就遇到了问题,每次 cap:deploy 到 assets:precompile 这一步等的时间比较长,导致后面的动作无法进行,因为服务器自己把这个连接踢掉了,表现在终端就是长时间没有输出,我想了想自己的解决方法, 一:有没有加快 assets:precompile 的办法。因为我的项目里用到了比较多的 js css,production.rb 中的配置文件如下

config.assets.precompile += ['login.js', 'manager.js', 'jquery1.4.2.js','teacher.js','extjs-default.css','extjs-pink.css','extjs-yellow.css','resetpasswd/jquery-1.9.1.js','resetpasswd/editpassword.css','ext-lang-zh_CN.js','extjsmsgbox.css']

将这些 js 和 css 写在一个文件中会不会加快这个过程, 二:直接想在本地上 assets:precompile 好后将相关文件拷过去,或者做成一个 cap 的任务,

以上是我的一点想法,不知道各位大牛有什么办法没

nohup rake assets:precompile &

除非特殊需求,否则一般只要一个 application.js 和 application.css 文件就好了。Rails 4 之后已经默认加上了 precompile 的变化检测,如果没有修改时不需要重新 precompile 的。

assets:precompile 慢到什么程度?还有 cap 通过 ssh 连接部署的,你可以设置一下 SSH Keep Alive 试试看

将你那些 js 和 css 文件分别都放进 application.jsapplication.css,这样在预编译的时候,就会把这些文件合并成一个文件。

// app/assets/javascripts/application.js
//
//= require jquery
//= require jquery_ujs
//= require moment.min
//= require moment-zh-cn
//= require bootstrap
//= require daterangepicker
/* app/assets/stylesheets/application.css*/
 /**
 *= require daterangepicker-bs3
 *= require nv.d3.css
 *= require jquery-tablesorter/theme.bootstrap
 *= require public/nsprogress
**/

@import "bootstrap";
@import "font-awesome";
@import "public/base";
@import "public/input";
@import "public/form_filter";
@import "public/table";
@import "public/accordion";
@import "sessions";

Rails4 在编译的时候会先检查这些文件有没有变动,如果有的话就重新编译一次,如果没有的话就跳过。缓存相关文件你可以在 tmp/cache/assets 里找到。

另外,如果你是用 capistrano 做一键部署的话,那么可以把缓存文件放到 shared_path 里去,然后在跑 rake assets:precompile 之前,把缓存目录重新链接到 current_path,这样 Rails 就会自动检查决定是否要重新编译。

先检查一下服务器的 shared 目录有没有相应的文件夹 ,或者 deploy 脚本有没有已经自动去链接这个文件夹,如果有就去掉,然后在部署脚本 config/deploy.rb 里加上

namespace :deploy do
  desc "ln_cache_assets_folder"
  task :ln_cache_assets_folder, roles: :web do
    run "ln -nfs #{shared_path}/cache #{release_path}/tmp/cache"
  end
end
before "deploy:assets:precompile", "deploy:ln_cache_assets_folder"

如果是第一次部署的话,隔 30 秒敲一下回车键就好了,这样就不会断了,嘿嘿 😄

@sunday35034 @zlx_star @lgn21st @hz_qiuyuanxin,谢谢各位的建议,我现在部署了一下可以,应该是网络的问题,不过 hz_qiuyuanxin 的方法我还是不知道的,学习了

设置部署机器 ssh 保持连接

匿名 #7 2014年06月12日

其实你每次部署时可以把 assets 和代码分开,assets 在本地单独 precompile,然后 copy 到远程。 我现在项目之前是在一起发布一次要近半个小时 - -! 我分开后发布用时不到 10 分钟,其中 8 分钟是 assets:precompile。 已经很给力了

赞同@hz_qiuyuanxin的做法,不过后半部分服务器端的做法不同。

assets 在本地 compile 完,然后 gz 上传到到 server 上!

http://dlj.bz/KT3u

namespace :toldo do
  desc "Compress assets in a local file"
  task :compress_assets do
    run_locally("rm -rf public/assets/*")
    run_locally("bundle exec rake assets:precompile")
    run_locally("tar zcvf assets.tgz public/assets/")
    run_locally("mv assets.tgz public/assets/")
  end

  desc "Upload assets"
  task :upload_assets do
    upload("public/assets/assets.tgz", release_path + '/assets.tgz')
    run "cd #{release_path}; tar zxvf assets.tgz; rm assets.tgz"
  end
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号