2013-10-18 18 views
25

Sto provando a scrivere un'attività per Capistrano 3 che implica l'esecuzione di "installazione di compositore" all'interno della directory della versione corrente. Sembra qualcosa di simile:Capistrano 3 eseguito all'interno di una directory

namespace :composer do 
    desc 'Install dependencies with Composer' 
    task :install do 
    on roles(:web) do 
     within release_path do 
     execute "#{fetch(:composer_command)} install" 
     end 
    end 
    end 
end 

composer_command si trova nel file di gestione temporanea e di produzione - nel mio caso particolare php /home/user/composer.phar

Per qualche ragione questo comando in realtà non eseguito nella directory versione corrente, ma invece viene eseguito in directory superiore (contenenti attuali, condivise, stampa, ecc)

ho approfondito questo un po 'più lontano e ha scoperto che quando mi sono imbattuto un unico comando parola, come:

within release_path do 
    execute "pwd" 
end 

Funziona perfettamente e esegue il comando nella directory di rilascio corrente. Ma ... quando esegue un comando con spazi, come:

within release_path do 
    execute "pwd && ls" 
end 

Si corre nella directory padre, e non la directory impostata dal blocco within.

Qualcuno può far luce su questo? Grazie!

risposta

25

Odora di bug di Cap 3.

Suggerisco solo garantendovi sei dove si desidera essere dal punto di vista della shell:

execute "cd '#{release_path}'; #{fetch(:composer_command)} install" 
+3

Ho sollevato un problema - https://github.com/capistrano/capistrano/issues/719 Si scopre che si tratta di un vincolo con SSHKit. Quindi vado con la tua soluzione - il vecchio capistrano 2 modo, per così dire. –

+4

Questo non è un bug. È come funziona SSHKit. Vedi altre risposte. – gagarine

+0

Tu rocce, grazie! –

7

Un paio di consigli:

1) Capistrano utilizza SSHKit per un sacco di cose, tra cui il comando esecuzione. Al fine di semplificare utilizzando Composer è possibile configurare la mappa dei comandi (in deploy.rb o production.rb, ecc), qui ci sono 2 esempi:

SSHKit.config.command_map[:composer] = "#{shared_path.join('composer.phar')}" 
SSHKit.config.command_map[:composer] = '/usr/bin/env composer.phar' 

successiva è possibile eseguire in questo modo:

execute :composer, :install 

2) Dal punto di vista della sicurezza, è consigliabile disattivare l'impostazione php allow_url_fopen, ma purtroppo il compositore ha bisogno che funzioni. È possibile utilizzare questo trucco per lasciarlo disabilitato a livello globale:

SSHKit.config.command_map[:composer] = "/usr/bin/env php -d allow_url_fopen=On #{shared_path.join('composer.phar')}" 

Partenza iniscan per ulteriori consigli di sicurezza sulle impostazioni php.

3) Il compositore ha un'opzione -d, --working-dir, che è possibile puntare alla directory contenente il file composer.json per eseguire Composer da qualsiasi altra directory. Questo dovrebbe risolvere il problema:

execute :composer, '-d', release_path, :install 

4) Si consiglia di dare un'occhiata al progetto capistrano-composer :)

+0

Non so se è dovuto agli aggiornamenti di Capistrano o del mio caso specifico, ma quello che dovevo fare era modificare leggermente il secondo esempio: 'SSHKit.config.command_map [: compositore] ="/[diretto completo percorso per] /composer.phar "' all'interno del mio deploy.rb. Dopo di ciò, l'aggiunta di 'execute: compositore," install "nel mio file .rake ha funzionato bene. – karolus

4

In realtà, l'utilizzo della funzione within è quasi corretta.Ne hai fornito un'intera stringa come comando, ma il doc sottolinea che ciò comporta un comportamento inaffidabile (che ho sperimentato personalmente).

Diamo il primo argomento di execute essere un simbolo invece di una stringa (che contiene spazi):

within release_path do 
    execute fetch(:composer_command).to_sym, "install" 
    execute :pwd 
    execute :ls 
end 
7

È possibile mantenere tutte le sottigliezze di within(), with(), default_env, ecc, pur mantenendo la naturale sintassi della stringa:

within release_path do 
    execute *%w[ pip install -r requirements.txt ] 
end 
3

appena per riferimento qui è il Capistrano Doc spiegando perché within {} non funziona con gli argomenti con spazi. Spero che aiuti.

Problemi correlati