2015-04-14 15 views
14

ho corse bundle update e aggiornato sprockets a 3.0.0.Capistrano 3 + Pignoni 3 + Rails 4.2.1 non verrà distribuito?

Quando cerco di distribuire via Capistrano 3 ottengo il seguente errore:

INFO [e54ac5ca] Running /usr/bin/env cp /var/www/testapp/releases/20150414002210/public/assets/manifest* /var/www/testapp/releases/20150414002210/assets_manifest_backup as [email protected] 
DEBUG [e54ac5ca] Command: cd /var/www/testapp/releases/20150414002210 && /usr/bin/env cp /var/www/testapp/releases/20150414002210/public/assets/manifest* /var/www/testapp/releases/20150414002210/assets_manifest_backup 
DEBUG [e54ac5ca] cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’ 
DEBUG [e54ac5ca] : No such file or directory 
DEBUG [d2c5a990] cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’ 
DEBUG [d2c5a990] : No such file or directory 
cap aborted! 
SSHKit::Runner::ExecuteError: Exception while executing as [email protected]: cp exit status: 1 
cp stdout: Nothing written 
cp stderr: cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’: No such file or directory 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/runners/parallel.rb:16:in `rescue in block (2 levels) in execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute' 
SSHKit::Command::Failed: cp exit status: 1 
cp stdout: Nothing written 
cp stderr: cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’: No such file or directory 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/command.rb:95:in `exit_status=' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:179:in `block in _execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:133:in `tap' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:133:in `_execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:66:in `execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/capistrano-rails-1.1.2/lib/capistrano/tasks/assets.rake:68:in `block (5 levels) in <top (required)>' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/abstract.rb:77:in `within' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/capistrano-rails-1.1.2/lib/capistrano/tasks/assets.rake:67:in `block (4 levels) in <top (required)>' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:54:in `instance_exec' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:54:in `run' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/runners/parallel.rb:13:in `block (2 levels) in execute' 
Tasks: TOP => deploy:assets:backup_manifest 
(See full trace by running task with --trace) 
The deploy has failed with an error: #<SSHKit::Runner::ExecuteError: Exception while executing as [email protected]: cp exit status: 1 
cp stdout: Nothing written 
cp stderr: cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’: No such file or directory 

Ho guardato intorno per le persone forse hanno gli stessi problemi e sembra che non ci sono problemi o commenti su nessuna parte ...

Onestamente non sono nemmeno sicuro di come sprockets, sprockets-rails siano correlati alle guide. Per me è tutto abbastanza confuso ... ad esempio, il valore predefinitoche viene fornito con una nuova app Rails 4.2.1 dice che le ruote dentate 3.0.0 sono consentite in Gemfile.lock, ma quando si passa alla guida di aggiornamento 2-> 3, mostra che //= include è stato rimosso, ma è proprio lì nel file application.js.

Così, forse mi manca qualcosa, ma io non sono molto sicuro come risolvere questo.

risposta

7

Il problema è facile da risolvere, ma penso che prima di tutto dobbiamo affrontare alcune delle altre questioni.

sprockets è una libreria rubino che consente di automatizzare la gestione web asset front-end (CSS, JS, immagini, ecc).

Si basa sull'idea di mantenere i file di risorse logicamente organizzato in fase di sviluppo, e per poi catena e Minify prima di andare in produzione. I pignoni rendono automatico questo processo.

Rails 3.1 (molto tempo fa, ormai) ha pubblicato una nuova funzionalità denominata "Asset Pipeline", che automatizzata la gestione delle risorse web. L'asset pipeline di Rails era, ed è tuttora, alimentato da sprockets.

Entrambe sprockets e rails sono librerie attivamente gestite e sviluppate. Le nuove versioni vengono rilasciate con nuove funzionalità e modifiche di rottura.
Credo che Rails non utilizzi, per impostazione predefinita, l'ultima versione di sprockets. Va bene, stiamo parlando di compilare CSS e JS qui, non interagendo con alcune API esterne; anche una vecchia versione di sprockets può fare il lavoro.
Ciò significa che l'aggiornamento di sprockets non è una buona idea. Ogni versione di Rails dichiara una versione specifica (min-max) di sprockets, per una buona ragione: è la versione su cui si basa l'attuale Asset Pipeline. L'aggiornamento potrebbe rompere le cose.

Poi, passiamo per il file manifesto.
Per impostazione predefinita, dopo precompilare le risorse (risolvere i riferimenti, inclusi alcuni file in altri, concatenarli e mininizzarli), le risorse compilate vengono copiate in RAILS_ROOT/public/assets. Con loro, Rails genera un file manifest che contiene un elenco di tutte le risorse precompilate. Nella tua versione di Rails dovrebbe essere manifest.json, ma era manifest.yml.

Ora, l'ultimo pezzo del puzzle è capistrano, che immagino tu sappia come usare.

La linea:

cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’ 

significa che capistrano cercato di trovare un file nella directory manifestRAILS_ROOT/public/assets. Il carattere jolly è lì perché potrebbe essere o manifest.json o manifest.yml, a seconda della versione di Rails.
Inoltre, stat significa che capistrano sta cercando di ottenere alcune informazioni dal file, probabilmente per capire quanto sia recente.

Il problema è che il file non è presente.
È necessario precompile the assets, quindi impegnare i file generati e provare a distribuire di nuovo.

+11

In realtà non c'è bisogno di precompilare le attività a livello locale e impegnarsi loro di repository in seguito. È un bug, e i ragazzi di capistrano ci stanno lavorando proprio ora: https://github.com/capistrano/rails/pull/112 e https://github.com/capistrano/rails/issues/111 in ogni caso , pollice in su per una risposta così dettagliata! –

+1

Oh, belle informazioni, grazie. Quando si distribuisce con capistrano, preferisco sempre una strategia di distribuzione che utilizza un ramo_deploy_, in modo che le "risorse compilate" non inquinino il tuo _master_. Inoltre, il più delle volte ti stai distribuendo in un cluster di server, e trovo inefficiente compilarli ancora e ancora su ogni server in cui ti schieri. Inoltre, precompilarli localmente rende più semplice automatizzare (all'interno dell'attività di distribuzione cap) caricandoli su un CDN. – tompave

+4

Per espandere il commento da @mid, ciò che è successo è che il pignone 3.0.0 [ha introdotto una modifica] (https://github.com/rails/sprockets/commit/ce6508e8540f829c6221afa39fdf718e4dded096) dove ha rinominato il file manifest da manifest.json a .sprockets-manifest.json. Stiamo aggiornando capistrano-rails per verificare la presenza di entrambi i nomi di file e utilizzare quello che trova. –

22

Se si utilizza capistrano-rails, provare ad aggiornare a 1.1.3. Questo ha risolto il problema per me.

capistrano-rails CHANGELOG:

1.1.3 (Apr 18 2015) 
- Fixed no_release behaviour (https://github.com/capistrano/rails/pull/95) 
- Allow assets manifest backup with folder "manifests" (https://github.com/capistrano/rails/pull/92) 
- Handle Sprocket 3 manifest filename 
+3

grazie mille !!! per altri manichini come me - nella versione set di gemfile direttamente gem 'capistrano-rails', '~> 1.1.3' – kpblc

4

per commentare, ho fissato questo aggiornando Capistrano-rail da 1.1.2 -> 1.1.3

# Gemfile 
'capistrano-rails', '~> 1.1.3'