2012-09-10 3 views
10

Vì một số lý do Capistrano không hoạt động trên mọi hoạt động, vì dường như nghĩ rằng current_path của tôi phải ở trong /u/apps/. Tôi đã đặt tất cả các biến (AFAIK) nên được đặt và loại bỏ tất cả các đường dẫn mặc định tương tự khác, nhưng điều này vẫn tồn tại.Tại sao Capistrano sử dụng/u/apps/trong current_path, mặc dù tôi đã đặt: deploy_to

Dưới đây là các giá trị được trả về bởi các biến có liên quan:

current_dir: current 
releases_path: /var/www/vhosts/dev.www.example.com/html/releases 
shared_path: /var/www/vhosts/dev.www.example.com/html/shared 
current_path: /u/apps/www.example.com/current 

Tôi đang thiết :deploy_to, vì vậy không current_path nên được tính toán trên cơ sở đó !?

set :deploy_to, "/var/www/vhosts/dev.www.example.com/" 
+2

Một nguyên nhân khác có thể xảy ra là nếu current_path được đọc trước deploy_to. Ví dụ, tôi đã có một tập hợp: sidekiq_pid, "# {current_path} /tmp/pids/sidekiq.pid" được gọi trước khi deploy_to trong tệp production.rb, do đó làm cho nó mặc định thành/u/apps. – JohnMerlino

+0

Nhận xét trên bởi @JohnMerlino là câu trả lời cho tôi. Giải pháp dễ nhất, dễ nhất 'sai lầm' để thực hiện trong mã của bạn. Máy cạo râu của Occam nói đây là câu trả lời :-) – LpLrich

Trả lời

6

Các loại dung dịch kludgey chỉ là tự

set :current_path, "" 

Các better solution, which can be found explained in this e-mail thread by Jamis Buck himself, là sử dụng đánh giá lười biếng khi bạn thiết lập một biến khác mà phụ thuộc vào current_path. Trong trường hợp của tôi, tôi đã có một cái gì đó thiết lập như thế này

set :some_path_var, "#{current_path}/some/path/" 

mà tôi đã phải thay đổi một cái gì đó như thế này:

set(:some_path_var) { "#{current_path}/some/path/" } 

Bằng cách vượt qua trong một khối, các: some_path_var đã không ngay lập tức đánh giá, và không bắt buộc phải đánh giá current_path dựa trên giá trị mặc định cho :deploy_to

2

Vì vậy, tôi cũng gặp vấn đề này và tôi nhận thấy đây là giải pháp tốt nhất.

Thêm này để bạn config/deploy.rb

desc "Make sure the symlink will be from the right directory" 
    task :change_correct_dir, roles: :web do 
    set :current_path, File.join(deploy_to, current_dir) 
    end 
    before "deploy:create_symlink", "deploy:change_correct_dir" 

tôi đã có ý tưởng từ cách nhìn vào nguồn gốc của đá quý capistrano và tìm

_cset(:current_path) { File.join(deploy_to, current_dir) trong

lib/capistrano/recipes/deploy.rb

1

này cũng có thể xảy ra nếu bạn không chỉ định một nhiệm vụ trong lệnh cap của bạn.

cap deploy:setup 

sẽ cố gắng để thiết lập Capistrano trong/u/apps

cap production deploy:setup 

sẽ thiết lập Capistrano trong thư mục quy định tại: deploy_to.

+0

Điều này chỉ đúng nếu plugin nhiều tầng được tải. –