2009-12-11 5 views
6

리팩토링 내 deploy.rb카피 스트라 노 : deploy.rb 파일

namespace :app do 
    desc "copies the configuration frile from ~/shared/config/*.yml to ~/config" 
    task :copy_config_files,:roles => :app do 
    run "cp -fv #{deploy_to}/shared/config/hoptoad.rb #{release_path}/config/initializers" 
    run "cp -fv #{deploy_to}/shared/config/app_config.yml #{release_path}/config/app_config.yml" 
    end 
end 

을 코드를 다음 한 나는 깨끗 내 deploy.rb 파일을 유지하는 것은 좋은 생각 일 것이다라고 생각했다 그리고 난에 코드 위의 이동을 시도 설정 아래 capistrano_utilities.rb. 나는 Rails 애플리케이션을 사용하고있다. 그리고 deploy.rb에 다음 코드 줄을 추가했습니다.

require File.expand_path(File.dirname(__FILE__) + "/../lib/capistrano_utilities") 

이제 다음 오류가 발생합니다.

deploy.rb의 self 값은 Capistrano :: Configuration입니다. capistrano_utilities에서 자기의 가치는 Main이지만. 그래서 왜 네임 스페이스 메서드 오류가 발생하는지 이해합니다. 이 문제에 대한 해결책은 무엇입니까?

답변

9

config/deploy.rb에는 require 대신 load을 사용해보십시오. 또한, 당신은 RAILS_ROOT에있어 것처럼 카피 스트라 노 이미 실행되므로 __FILE__를 사용할 필요가 없습니다하십시오 카피 스트라 노의 설정 파일에서

load "lib/capistrano_utilities" 

load는 현재 구성에 다른 구성 파일을로드 다시 정의됩니다. 경로를 전달할 때 실제로 디스크에서 파일을 읽고 instance_eval의 파일을 읽는 load_from_file (capistrano에서 정의한 개인 메서드)을 호출합니다.

+2

비록 require와 load의 유일한 차이점은 파일 중 하나가 메모리에 여러 번 읽히고 다른 하나는 한 번만 읽는 것입니다. 로드 작업이 왜 필요한지 설명 할 수 있습니까? – Roger

+0

Roger, 자세한 내용은 capistrano의 특성에 대해 추가되었습니다. –

+0

라이언에게 감사드립니다. 루비 생태계에서 또 다른 놀라운 마술. – Roger

0

Rails.root에서 Capfile을 확인하십시오. capistrano 3을 사용하는 경우이 줄이 표시됩니다.

Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

이제 "lib 디렉토리/카피 스트라 노/작업/capistrano_utilities.cap"에 파일을 넣어 그것을로드됩니다.

관련 문제