Capistrano的应用场景是待部署的服务器可以直接访问svn、cvs等源代码管理服务器,所以代码是直接checkout到服务器上的。但是实际的情况常常是,源代码管理服务器处于公司内网,而待部署的的服务器处于外网。这种情况
早就有人遇到过了,可以通过修改update_code这个任务来实现的。先是获取代码到本地机器,然后压缩成一个tar包,再传到服务器上并展开。
这主意不错,但是实际应用的时候却发现tar文件无法在服务器上正常解开。一开始我还以为是用windows版本的tar工具bsdtar有问题,换了WinRar来压缩,结果都一样。仔细看,原来是上传前后的字节大小并不一致。这似乎应该是文件打开模式的问题,文本模式和二进制模式?
代码是这样的:
put(File.read(src),dest)
我百思不得其解的是,File.read到底返回什么东西?如果是整个文件的内容,那么文件很大怎么办?而且,半天我也找不到File.read的定义。
在Google论坛上 发了帖子,有热心人指出了,在Window上File.read是以文本模式打开和读取的,所以有问题。建议换成
body=File.open(src, "rb") { |f| f.read }
put(body, dest)
就没有问题了!
并且 告诉了我,File是从IO继承的,File.read即IO.read,源代码在io.c里。
以上办法是一次性读取了文件的所有内容,内存占用比较厉害,还有 更好的办法。
真是太热心了,如果没有这些网友,我不知道还要琢磨到什么时候呢。
终于,实现了update和rollback,酷!还包括ruby的语法,为了读懂Capistrano的代码,恶补了很多ruby的知识,真的很灵活!
这主意不错,但是实际应用的时候却发现tar文件无法在服务器上正常解开。一开始我还以为是用windows版本的tar工具bsdtar有问题,换了WinRar来压缩,结果都一样。仔细看,原来是上传前后的字节大小并不一致。这似乎应该是文件打开模式的问题,文本模式和二进制模式?
代码是这样的:
put(File.read(src),dest)
我百思不得其解的是,File.read到底返回什么东西?如果是整个文件的内容,那么文件很大怎么办?而且,半天我也找不到File.read的定义。
在Google论坛上 发了帖子,有热心人指出了,在Window上File.read是以文本模式打开和读取的,所以有问题。建议换成
body=File.open(src, "rb") { |f| f.read }
put(body, dest)
就没有问题了!
并且 告诉了我,File是从IO继承的,File.read即IO.read,源代码在io.c里。
以上办法是一次性读取了文件的所有内容,内存占用比较厉害,还有 更好的办法。
真是太热心了,如果没有这些网友,我不知道还要琢磨到什么时候呢。
终于,实现了update和rollback,酷!还包括ruby的语法,为了读懂Capistrano的代码,恶补了很多ruby的知识,真的很灵活!