2011-10-28 68 views
3

我在使用資產管道和預編譯Capistrano任務部署大型應用程序的想法陷入困境。Rails 3.1資產管道生產無法使用javascript運行時環境

  1. 我不想安裝javascript運行時環境並預編譯每個生產服務器上的資產。

  2. 資產需要上傳到兩個沒有應用程序副本的Nginx服務器。

所以我創建了一個Capistrano的任務在本地預編譯的資產,然後上傳資產的Nginx的服務器和清單文件到應用服務器。

問題是我本地計算機上的資產可能與我部署的git分支資產不同。

有沒有更好的方法,或者我是否只是爲了始終從正確的清潔分支進行部署?這裏

編輯是帽任務,做預編譯,並上傳

namespace :assets do 
    after "deploy:update_code", "assets:precompile" 
    after "assets:precompile", "assets:upload_assets" 
    after "assets:precompile", "assets:upload_manifest" 


    desc "precompile assets" 
    task :precompile do 
    run_locally("bundle exec rake assets:clean && bundle exec rake assets:precompile RAILS_ENV=#{rails_env}") 
    end 

    desc "precompile and upload assets to webserver" 
    task :upload_assets, :roles => :nginx do 
    top.upload("public/assets", "/usr/local/fieldphone/#{rails_env}/", :via => :scp, :recursive => true) 
    end 
    # 
    desc "upload manifest file" 
    task :upload_manifest, :roles => :app do 
    top.upload("public/manifest.yml", "#{release_path}/public/", :via => :scp) 
    end 

end 

回答

0

你說在你的本地計算機資產可能從不同的部署分支。在正常情況下,您的開發環境不需要編譯資產。

這樣做我建議你改變你的任務,在資產部署完成後刪除它們,任何時候都保持本地工作副本的清潔。這可以保證每個部署獲取最新(正確)版本的文件。 (如果你不這樣做,我還建議你使用dev模式的默認選項,它依賴於Sprockets來完成所有的資產服務)。

+0

資產可能會有所不同,因爲源青菜和咖啡文件可能有最近的變化(未提交的修改,未跟蹤文件等)。我傾向於承諾編譯的資產(但也覺得很髒)。我認爲不必在生產服務器上編譯資產,然後將它們從生產服務器scp到正確的位置(nginx服務器)。 –

+0

如果沒有編譯的文件,那麼所有的資源都是動態提供的。這沒有發生?另外,如果您使用主分支作爲生產/穩定,那麼我沒有發現提交它們的任何錯誤。 –

+0

在開發中是的,它們是動態服務的。在生產中,它們不能動態地提供服務nginx提供預編譯的文件。我只想提出一種更好的方式來預編譯它們並將它們上傳到nginx服務器。 –

0

我不認爲將文件提交到repo並將其部署到Nginx服務器 - 這與供應商緩存中的寶石類似 - 這是多餘的,但這是有原因的。

另一種選擇是將應用程序實際部署到您的Nginx服務器,並讓Capistrano在那裏編譯資產,但不在這些服務器上啓動應用程序(爲「資產」創建Capistrano角色並將應用程序部署到它,但不要在該角色上啓動它)。這可能會有點混亂...

作爲最後一種選擇,如果您不想讓您的資產服務器的水域變得渾濁,或者希望讓您的選項可以在其他地方部署資產,那麼您可以讓Capistrano git stash任何未保存的更改首先檢查主分支,然後編譯資產,上傳它們,刪除它們,結帳前一個分支(git checkout -),重新應用保存的更改(git stash apply --index),然後繼續! :)

資源:

http://git-scm.com/book/en/Git-Tools-Stashing

Is there any way to git checkout previous branch?