Ant에서 타겟들 사이의 의존관계는 target 태그의 depends 속성에 정의했습니다. 아래에서 B 타겟은 A 타겟에 의존합니다. B가 실행되기 위해서는 먼저 A가 실행되어야 합니다.

<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>

D 타겟을 실행하면 D => C => B => A 로 이어지는 의존고리에 의해서 A 타겟이 제일먼저 실행되고 차례로 B -> C -> D 가 실행이 됩니다. D의 depends 속성에 B와 A가 다시 나오지만 B와 A는 이미 실행됐기 때문에 또 실행되지는 않습니다.

Buildr에서 Ant의 타겟에 해당하는 것은 타스크(Task) 입니다. 타스크는 task 메소드로 만듭니다.

desc "내 첫번째 타스크"
task :my_first_task do
    # do ~ end 블록에 타스크가 처리할 내용을 코딩합니다
   puts "첫번째 타스크"
end

task :my_second_task => :my_first_task do
   puts "두번째 타스크"
end

{:my_second_task => :my_first_task} 처럼 task 메소드에 해쉬를 넘겨주어 의존관계를 설정할 수 있습니다. 예제에서는 :my_first_task에 의존하는 :my_second_task 타스크가 만들어집니다. 의존하는 타스크가 여러개이면 배열로 나열하면 됩니다.

task :my_third_task => [:my_second_task, :my_first_task] do .... end

이미 타스크가 정의된 뒤에도 선행 타스크(prerequisites)를 추가하는 것이 가능합니다.

task :my_second_task => [:compile, :copy_images]

:my_second_task 타스크의 필요 선수조건은 이제 [:my_first_task, :compile, :copy_images] 타스크가 됩니다.
게다가 타스크가 해야할 일(action)도 나중에 추가할 수 있습니다.

task :my_second_task do
   puts "두번째 타스크에 액션 추가"
end

:my_second_task 타스크를 실행하면 ""두번째 타스크" 가 출력된 뒤에 "두번째 타스크에 액션 추가"가 출력됩니다.
사실 task 메소드는 주어진 이름의 타스크가 없으면 새로 만들고, 이미 있는거면 선행타스크와 액션을 그 타스크에 추가해줍니다.

Buildr은 Maven의 phase와 유사하게 이미 정의된 기본 타스크를 갖고 있습니다. compile, resources, build, package, javadoc, test, .... 등이죠. 전체 목록은 buidr help라고 치면 나옵니다.
내가 정의한 타스크를 이들 기본 타스크와 연계시키는 것은 매우 쉽습니다. 예를들어, compile 타스크가 실행되기 '전'에 :my_first_task 타스크가 실행되어야 한다면, task :compile => :my_first_task 이거 한줄이면 끝납니다. 메이븐보다 훠얼씬 쉽습니다.

메이븐에서는 골(goal)을 어떤 phase에 바인딩하게 되면 그 goal은 무조건 그 phase가 끝난 후(phase에 이미 바인딩된 다른 goal들이 모두 실행된 후)에 실행됩니다. phase 시작 전에 goal이 실행되어야 한다면 앞단계 phase에 바인딩해주어야 합니다. 그래서 my:first_goal이 compile 단계보다 먼저 실행되어야 한다면, compile의 앞단계인 process-resources 단계에 바인딩해주어야 합니다. 거참..좀 거시기하네요.. -.-;
아, 제가 하고 싶은 얘기는 메이븐 나뻐, 이게 아니구요 ^^ Buildr이 메이븐보다 더 유연하다는 것뿐이고...~

Buildr에서 메이븐처럼 어떤 타스크가 다른 타스크 뒤에 실행되게 하려면 명시적으로 후행 타스크의 invoke 메소드를 호출하면 됩니다.

task :after_second_task do
   puts "두번째 타스크 실행 후 추가 작업"
end

task :my_second_task do
   task(:after_second_task).invoke
end

만약에 compile 타스크가 실행된 '후'에 :my_first_task 타스크와 :process-classes 타스크가 실행되어야 한다면 이렇게 해줍니다.(invoke는 전체 빌드에서 타스크를 한번만 실행시키고, execute는 나올때마다 실행시킵니다)

compile do
     task(:my_first_task).invoke
     task(:process-classes).invoke
end

여기서 compile 타스크를 task(:compile)로 참조하지 않고 그냥 compile 메소드를 사용했습니다. Buildr에는 이미 해당 타스크를 리턴하는 resources, compile, build, ... 등의 메소드가 정의되어 있기 때문에 그냥 불러다 쓰면 됩니다.

'Build&Deploy > Buildr' 카테고리의 다른 글

Buildr : 빌드결과 패키징  (0) 2008.12.18
Buildr : 아티팩트 다운로드 받기  (0) 2008.12.17
Buildr : 리소스 교체  (3) 2008.12.09
Buildr : 리소스 필터링  (0) 2008.12.09
Buildr : 파일집합 복사하기  (0) 2008.12.05
Posted by 에코지오
,