2013-10-18 13 views
25

Geçerli sürümün dizini içinde 'besteci yüklemesini' yürütmeyi içeren Capistrano 3 için bir görev yazmaya çalışıyorum. Bu komut aslında Mevcut yayın dizinde çalışmaz Nedense benim özel durumda php /home/user/composer.pharCapistrano 3 bir dizinin içinde yürütme

için, bunun yerine -

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 evreleme ve üretim dosyalarında ayarlanır: Bu şuna benzer

ben biraz daha ileri bu kazarak, bulunan (cari, paylaşılan, bültenleri, vb içerir) üst dizinde çalışır ben gibi tek kelime komutu, çalıştırdığımızda:

within release_path do 
    execute "pwd" 
end 

Sadece iyi çalışıyor ve geçerli sürüm dizinindeki komutu çalıştırıyor.

within release_path do 
    execute "pwd && ls" 
end 

O within bloğu tarafından belirlenen dizin üst dizinde çalışır ve değil: Ama ... ben gibi, boşluk içeren bir komut çalıştırdığınızda.

Birisi buna ışık tutabilir mi? Teşekkürler!

cevap

25

Bir Cap 3 hatası gibi kokuyor.

Sadece kabuk perspektifinden olmak istiyorum nerdesin garanti öneriyorum:

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

Bir sorunla karşılaştım - https://github.com/capistrano/capistrano/issues/719 Bu, SSHKit ile bir kısıtlama olduğunu ortaya koyuyor. Böylece çözümünüzle gideceğim - eski capistrano 2 yolu, olduğu gibi. –

+4

Bu bir hata değil. SSHKit böyle çalışır. Diğer cevapları gör. – gagarine

+0

Kayalar, teşekkürler! –

7

ipuçları bir çift:

1) Capistrano, bir çok şey için SSHKit kullandığı komut arasında yürütme. Eğer (deploy.rb veya production.rb, vb) komut harita yapılandırabilirsiniz Composer ile basitleştirmek amacıyla, burada 2 örnek:

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

Sonraki bunu gibi yürütebilirsiniz:

execute :composer, :install 

2) Güvenlik açısından php ayarı allow_url_fopen'u devre dışı bırakmak akıllıcadır ancak maalesef Composer'ın çalışması için etkin olması gerekiyor. Bunu küresel devre dışı bırakmak için bu hileyi kullanabilirsiniz: php ayarları hakkında daha fazla güvenlik tavsiye için dışarı iniscan

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

kontrol edin.

3) Composer, Composer'ı başka bir dizinden çalıştırmak için composer.json dosyasını içeren dizini işaretleyebileceğiniz bir -d, --working-dir seçeneğine sahiptir.

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

4) Sen capistrano-composer projesi :)

+0

Capistrano ya da benim özel durumumdaki güncellemelerden kaynaklanıp kaynaklanmadığını bilmiyorum ama ne yapmam gerekti, ikinci örneğinizi biraz değiştirdim: 'SSHKit.config.command_map [: composer] ="/[direct full /composer.phar adresindeki "deploy.rb" dizinine giden yol. Bundan sonra, .list dosyasına "execute: composer", "install" eklenmesi işe yaradı. – karolus

4

bakmak isteyebilirsiniz Aslında within fonksiyonun kullanımınız neredeyse doğru geçerli: Bu sorunu çözmek gerekir.Komutu bir komut olarak tümüyle sağladınız, ancak doc bunun güvenilir olmayan davranışlarla sonuçlandığını gösteriyor (ki kendimi tecrübe ettim). Hala doğal tutarken, Sen vs within() tüm incelikler, with(), default_env, koruyabilirsiniz

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

:

execute ilk argüman (boşluk içeriyor) yerine bir dize sembolü olsun dize sözdizimi: sadece burada referans için

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

within {} boşluk ile argümanlarla neden çalışmıyor açıklayan Capistrano Doc olduğunu. Umarım bu yardımcı olur.

İlgili konular