2011-01-10 63 views
8

每次运行在远程服务器上部署我丢失了一些未受版本控制的文件,因为capistrano会创建一个新目录并检出其中的最新版本。但是有些文件没有像用户头像(回形针)和上传的图像那样版本化,并且没有被复制到新的当前版本。使用Capistrano部署时保留未版本控制的文件

我该如何解决这个问题?

谢谢!

回答

14

就我个人而言,我认为处理这些事情的最佳方式是将它们存储在共享文件夹中,并在capistrano中创建任务以创建符合链接的共享资源。

下面是我的一个项目为例:

set :shared_assets, %w{public/images/products public/images/barcodes} 

namespace :assets do 
    namespace :symlinks do 
    desc "Setup application symlinks for shared assets" 
    task :setup, :roles => [:app, :web] do 
     shared_assets.each { |link| run "mkdir -p #{shared_path}/#{link}" } 
    end 

    desc "Link assets for current deploy to the shared location" 
    task :update, :roles => [:app, :web] do 
     shared_assets.each { |link| run "ln -nfs #{shared_path}/#{link} #{release_path}/#{link}" } 
    end 
    end 
end 

before "deploy:setup" do 
    assets.symlinks.setup 
end 

before "deploy:symlink" do 
    assets.symlinks.update 
end 
+0

我明白,但......“共享”目录是一个capistrano的事情,据我所知,Rails并不知道。那么,我该如何告诉rails将文件保存在应用程序之外的目录中,并且它不存在于我的本地副本中? – emzero 2011-01-10 18:38:20

8

将您的路径shared_children也适用,它实际上只是一个班轮在你的deploy.rb:

set :shared_children, shared_children + %w{public/uploads} 

发现这里:astonj

0

这里是非常微小和有用的宝石:https://github.com/teohm/capistrano-shared_file。检查宝石的文档 - 一切都很简单。

安装宝石,在deploy.rb需要它,只是提供你希望在shared_files选项版本之间共享文件的数组:

set :shared_files, %w(config/database.yml) 

存储文件的<project_dir>/shared/files/YOUR_FILE_GOES_HERE。在每次部署时,它们都将与您的应用程序的根目录相符。就这样。