2014-01-20 26 views
2

我的應用程序的公共(公共/資產)目錄中沒有任何資產文件夾。當我試圖部署與capistrano v3。我的遠程機器中創建了一個名爲public/assets的新文件夾。我也遇到以下錯誤,因爲它在public/assets(public/assets/manifest *)下搜索名爲manifest.yml的文件。有必要嗎??這樣做的目的是什麼???資產文件夾在部署capistrano時自動在公共場所創建3

//getting the following error while deploying 
DEBUG [014a40e4] Running /usr/bin/env [ -L /home/ec2-user/capistrano-3/my_app/releases/20140117124107/public/assets ] on 50.13.220.55 
DEBUG [014a40e4] Command: [ -L /home/ec2-user/capistrano-3/my_app/releases/20140117124107/public/assets ] 
DEBUG [014a40e4] Finished in 0.602 seconds with exit status 1 (failed). 
DEBUG [9c5901ab] Running /usr/bin/env [ -d /home/ec2-user/capistrano-3/my_app/releases/20140117124107/public/assets ] on 50.13.220.55 
DEBUG [9c5901ab] Command: [ -d /home/ec2-user/capistrano-3/my_app/releases/20140117124107/public/assets ] 
DEBUG [9c5901ab] Finished in 0.639 seconds with exit status 1 (failed). 

////此錯誤在跟蹤

**調用部署的末尾:資產:backup_manifest(FIRST_TIME)

**執行部署:資產:backup_manifest

DEBUG [a08f4c02] cp: 
DEBUG [a08f4c02] cannot stat `/home/ec2-user/capistrano-3/my_app/releases/20140117064709/public/assets/manifest*' 
DEBUG [a08f4c02] : No such file or directory 
DEBUG [a08f4c02]  
cap aborted! 
cp stdout: Nothing written 
cp stderr: Nothing written 

Tasks: TOP => deploy:assets:backup_manifest 
The deploy has failed with an error: #<SSHKit::Command::Failed: cp stdout: Nothing written 
cp stderr: Nothing written 
> 
** Invoke deploy:failed (first_time) 
** Execute deploy:failed 

回答

1

這是Asset Pipeline的rails默認功能。閱讀此以獲得更好的理解。 Asset Pipleine

資產管道提供了一個框架來連接,然後再縮小或壓縮 JavaScript和CSS的資產。它還增加了將這些資源編寫成 其他語言(如CoffeeScript,Sass和ERB)的功能。

當您運行在生產環境中的Rails應用程序,存在於應用程序中的媒體內容/資產編譯和多個文件連接成一個資產的更快的加載。

您可以檢查config/application.rb文件。 config.assets.enabled = true

這可啓用資產流水線。

當資產預編譯發生時,它們被放置到public/assets文件夾中,並且條目在manifest.yml文件中更新。

Rails應用程序將默認搜索資產公共/資產文件夾中。如果沒有更改,資產將不會再次編譯。 您可以使用以下方式編譯資產:rake assets:precompile或者當您重新啓動服務器時,它會自動編譯。必須有一個像node.js或rubyracer這樣的js編譯器來編譯js。

如果您想避免編譯,請從application.rb中禁用它,併爲生產環境中的資產提供路徑。在開發模式下,資產由應用程序/資產提供。您也可以嘗試運行rake assets:precompile並檢查是否創建了public下的資產文件夾。

+0

@ GhostRider-你的內容非常有用。謝謝。當我運行rake資產時:預編譯清單文件夾被生成。但是,當我運行cap開發部署 - 跟蹤我再次得到相同的錯誤。更新了我的問題中的錯誤。我正在從當地環境部署到ec2開發環境。 – Sam

3

按照它的外觀,你可能在應用程序中使用3.1或更高版本的rails。

基本上,從導:

資產管道提供了一個框架來連接和運行如下或 壓縮JavaScript和CSS資產。它還增加了使用CoffeeScript,Sass和ERB等其他語言編寫 這些資產的功能。

以下是你需要知道的一切:http://guides.rubyonrails.org/asset_pipeline.html

正如在指南中提到的,你可以通過將/修改下面的代碼配置禁用/ application.rb中文件:

config.assets.enabled = false 

如果您繼續使用資產管道,那麼您可以使用以下命令預編譯資產:

rake assets:precompile 
# or 
rake assets:precompile:all 

關於menifest.yml(從導本身):

rake任務還生成一個包含所有的資產和各自的指紋列表的manifest.yml。 Rails輔助方法使用這個方法來避免將映射請求交還給Sprockets。一個典型的清單文件看起來像:

--- 
rails.png: rails-bd9ad5a560b5a3a7be0808c5cd76a798.png 
jquery-ui.min.js: jquery-ui-7e33882a28fc84ad0e0e47e46cbf901c.min.js 
jquery.min.js: jquery-8a50feed8d29566738ad005e19fe1c2d.min.js 
application.js: application-3fdab497b8fb70d20cfc5495239dfc29.js 
application.css: application-8af74128f904600e41a6e39241464e03.css 

所以,當你運行rake任務。它將生成包含資產條目的menifest.yml文件,其中包括用於在客戶端級別緩存資產的md5哈希摘要。每次運行rake任務時,都會爲您的資產獲得新的散列值。當瀏覽器收到服務器的響應時,驗證/失效您的資產。

我鼓勵您使用資產管道,因爲它還可以讓您以更好或更簡單的方式使用CDN。但是,在一天結束時,這是您的選擇。

UPDATE:require 'capistrano/deploy'內Capfile: 對於Capistrano的3部署(因爲Capistrano的3有很多DSL的變化)與走來。因此,您不必爲自己的部署編寫自己的precompile_assets任務。

看一看這個答案:https://stackoverflow.com/a/15690628/645886,和這個:http://blog.blenderbox.com/2013/11/06/precompiling-assets-with-capistrano-3-0-1/。我希望這有幫助。

+0

@ Surya-你的內容非常有用。謝謝。當我運行rake資源時:會生成預編譯清單文件夾。但是,當我運行cap開發部署 - 跟蹤我再次得到相同的錯誤。更新了我的問題中的錯誤。我正在從當地環境部署到ec2開發環境。 – Sam

+0

查看更新。 – Surya

相關問題