2011-01-10 8 views
8

Jedes Mal, wenn ich cap deploy auf dem Remote-Server ausführen, habe ich einige nicht versionierte Dateien verloren, weil capistrano ein neues Verzeichnis erstellt und die Hauptversion darin auscheckt. Aber es gibt einige Dateien, die nicht wie Benutzer Avatare (Büroklammer) versioniert sind und hochgeladene Bilder, die nicht in die neue aktuelle Version kopiert werden.Unveränderte Dateien bei der Bereitstellung mit Capistrano behalten

Wie kann ich dies umgehen?

Danke!

Antwort

14

Persönlich denke ich, der beste Weg, um mit diesen Dingen umzugehen, ist, sie im freigegebenen Ordner zu speichern und eine Aufgabe in capistrano zu erstellen, um Symlinks zu den gemeinsamen Assets zu erstellen.

Hier ist ein Beispiel von einem meiner Projekte:

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

Ich verstehe, aber ... das "geteilte" dir ist eine capistrano Sache, Rails weiß es nicht, soweit ich weiß. Also, wie soll ich Rails mitteilen, Dateien in diesem Verzeichnis zu speichern, das außerhalb der Anwendung liegt und kein Ereignis in meiner lokalen Kopie existiert? – emzero

+0

Sie ändern nichts in Rails. Das ist der Sinn dieser Taktik. Rails speichert die Bilder immer noch in "RAILS_ROOT/public/images/avatars" oder was auch immer, aber dieser Ordner ist eigentlich ein [symlink] (http://en.wikipedia.org/wiki/Symbolic_link) zu einem Ordner in capistrano's "shared" Mappe. – idlefingers

+1

Ohh, ja, du hast Recht ... Ich habe es nicht gesehen. Vielen Dank! =) – emzero

8

Ihre Wege auch das Hinzufügen shared_children funktioniert und ist eigentlich nur ein Einzeiler in Ihrem deploy.rb:

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

gefunden hier: astonj

0

Hier ist sehr winzig und nützlich gem: https://github.com/teohm/capistrano-shared_file. Überprüfen Sie die Dokumente des Edelsteins - alles ist einfach.

gem installieren, in deploy.rb es erfordern und bieten nur eine Reihe von Dateien, die Sie wollen in shared_files Option zwischen den Versionen teilen:

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

Speichern Sie Ihre Dateien auf <project_dir>/shared/files/YOUR_FILE_GOES_HERE. Und sie werden bei jeder Bereitstellung mit dem Stamm Ihrer Anwendung verknüpft. Das ist alles.

Verwandte Themen