2010-12-15 5 views
1

우리는 Buildr을 사용하여 응용 프로그램을 .war 파일로 패키지화하고 있습니다. 더 자동화 된 배포 프로세스를 간소화하기 위해, 나는두 파일 중 하나를 Buildr과 함께 .war 패키지에 조건부로 포함시키는 방법은 무엇입니까?

  • database-hsql.properties
  • database-postgres.properties

... 조건 (디렉토리 src/main/resources에서)이 두 파일 중 하나를 선택하고자 ... 그리고 것 결과는 .war에 database.properties이라는 이름으로 포함시킵니다. (예 : WEB-INF/classes/, 즉 src/main/resources의 파일이있는 WAR 내부의 동일한 위치)

이 작업을 수행하는 간단한 방법은 무엇입니까? 모든 접근 방식은 괜찮습니다 — 예 : "package-hsql"& "package-pgsql"—과 같이 두 가지 다른 작업/대상을 정의하는 것 (간단히 말해서)은 매우 간단합니다. buildfile

관련 비트 :

load 'dependencies' 
require 'buildr/hibernate' 

desc "..." 
define "foo" do 

    project.version = VERSION_NUMBER 
    project.group = GROUP 
    manifest["Implementation-Vendor"] = COPYRIGHT 
    compile.with WICKET,GUAVA,GSON, ... [many more libs] 
    test.with MOCKITO 
    resources 

    test.compile.with SERVLET,_('src/main/webapp'),_('src/main/resources') 
    package(:war).with(:libs=> [WICKET,GUAVA,GSON, ... ]) 

end 

보너스 질문 : 임의의 쉘 명령을 실행하는 방법을 변경하려면 두 개의 각각의 경우에 (나는 예를 들어 >> 또는 sed 관련된 무언가를 사용하십시오) 다른 설정 파일? (나는 또한 다른 파일에서 applicationContext.xml에 db 설정을 "주입"하고 싶습니다.이 파일을 VCS에 두 개로 유지하는 것이 더 좋을 것입니다.

죄송합니다. 저는 Buildr과 함께 한 초보자이고 Ruby에 대해 잘 모릅니다. (그렇습니다. 현재 팀 구성원이 능숙하지 않은 도구를 사용하는 것이 최적의 상황은 아닙니다 ...) 무엇이든지 명확히해야하는 경우이를 지적하십시오!

답변

2

buildr 빌드를 매개 변수화하는 일반적인 방법은 환경 변수를 사용하는 것입니다. 예를 들어 당신이 빌드를 설계 할 수 있도록과 같이 실행합니다 :

당신의 빌드 파일에서
$ buildr package DATABASE=postgres 

당신은 다음이있을 수 있습니다

ENV['DATABASE'] ||= 'hsql' # this line makes the default 'hsql' 

define "foo" do 
    # the rest of the definition 

    resources.enhance do 
    cp _(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties"), _(:target, :resources, "database.properties") 
    end 
end 

이 가장 간단한 솔루션입니다; 당신이 실제로 사용하게 될 database.properties 파일 외에 두 개의 database-*.properties 파일을 복사한다는 단점이 있습니다. 그게 문제라면 약간의 복잡성을 희생시키면서 해결 될 수 있습니다.

보너스 답변 : system을 사용하여 임의의 쉘 명령을 실행할 수 있습니다.

resources.enhance do 
    system("cp '#{_(:source, :main, :resources, "database-#{ENV['DATABASE']}.properties")}' '#{_(:target, :resources, "database.properties")}'") 
end 

것은 당신이 구성 파일에 속성을 주입하고자하는 경우 Buildr의 filter 메커니즘을보고 할 수 있습니다 : 예를 들면, subshelling의 비용으로 I는 위의 구현 할 수 있었다.

+0

대단히 감사합니다. 나는 "cp"접근법을 사용하여 작동하게했다. (지금은 약간 바쁘지만 나중에 보너스 케이스 (applicationContext.xml)를 정리해야합니다. 아마도 필터 메커니즘을 사용해야 할 것입니다.) – Jonik