'Filter'에 해당되는 글 2건

  1. 2008.12.09 Buildr : 리소스 필터링
  2. 2008.12.05 Buildr : 파일집합 복사하기
리소스 설정치환은 리소스 필터링과 리소스 교체로 나눌 수 있습니다. 이 중에서 리소스 필터링은 원본 리소스 파일을 타겟으로 복사하면서 파일 내의 특정 부분을 다른 문자열로 치환하는 방법입니다. Ant, Maven, Buildr에서 이것을 어떻게 처리하는지 살펴봅니다.

1. Ant는 copy 타스크 내부에서 filter 요소를 사용하여 리소스 필터링을 지원합니다. 보통 @토큰@ 형식으로 표현된 내용이 다른 값으로 치환됩니다.

<copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt">
  <filterset>
    <filter token="DATE" value="${TODAY}"/>
    <filtersfile file="${user.dir}/dist.properties"/> <!-- 이름/값 쌍을 프로퍼티 파일로 제공 -->
  </filterset>
</copy>

2. Maven에서는 process-resources 단계(또는 'resources:resources' 골)에서 보통 ${프로퍼티} 형식의 문자열이 실제 그 프로퍼티 값으로 바뀝니다.

<resources>
 <resource>
  <directory>src</directory>
  <filtering>true</filtering>
  <excludes>
   <exclude>**/*.java</exclude>
  </excludes>
 </resource>
</resources>

프로퍼티는 여러방식으로 제공됩니다. (1) 메이븐 실행시 -D를 통해서 제공 (2) properties 엘리먼트에 기술 (3) 프로퍼티 파일을 지정 (4) 시스템 프로퍼티. 프로퍼티 파일 형태로 이름/값 쌍을 제공하는 경우 아래처럼 build 밑에 filters 엘리먼트에 파일의 위치를 기술하면 됩니다.

<build>
  <defaultGoal>install</defaultGoal>
  <directory>${basedir}/target</directory>
  <finalName>${artifactId}-${version}</finalName>
  <filters>
     <filter>filters/filter1.properties</filter>
  </filters>
  ...
</build>


3. Buildr의 리소스 필터링은 메이븐과 유사합니다. Buildr에서는 resources 타스크를 통해 리소스의 내용을 필터링합니다. 기본적으로 src/main/resources 디렉토리의 리소스 파일들을 target/resources 디렉토리로 복사하면서 필터링을 수행합니다.

resources.from _('src/etc') # 원본 리소스 파일 디렉토리 변경
resources.include '*.html' # 포함할 파일 패턴
resources.exclude 'scratch/*' # 제외할 파일 패턴

resources
.filter.using 'version'=>'experimental''copyright'=>'Acme Inc (C) 2007' # 치환될 내용 매핑

위의 예제에서 리소스 파일내의 ${copyright} 부분은 'Acme Inc (C) 2007'로 바뀌게 됩니다. 이러한 이름/값 매핑은 당연히 외부 파일 형태로도 제공할 수 있습니다만, Buildr에서는 프로퍼티 형식이 아니라 buildr 파일과 동일한 위치에 있는 profiles.yaml 파일을 사용합니다. profiles.yaml 파일은 서로다른 환경에서 서로다른 설정을 가져가기 위한 것인데요(메이븐의 그것과 똑같은 개념입니다), 여기에 filter 엘리먼트를 추가하면 됩니다.

filter: &alpha1
  version: experimental
  copyright: Acme Inc (C) 2007
 
development:
  filter: *alpha1
test:
  filter: *alpha1

resources 타스크는 compile 타스크 실행시 자동으로 함께 수행됩니다. 아래처럼하면 단독으로 실행됩니다.

buildr 프로젝트이름:resources

그런데 이 리소스 필터링 기능이 resources 타스크가 실행될 때뿐 아니라 빌드의 다른 곳에서도 필요한 경우가 있습니다. 이때는 resources 타스크가 내부적으로 이용하고 있는 filter를 사용하면 됩니다.

filter('src/specs').into('target/specs').
  using('version'=>version, 'created'=>Time.now).run
신고

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

Buildr : 타스크 의존 관계  (0) 2008.12.11
Buildr : 리소스 교체  (3) 2008.12.09
Buildr : 리소스 필터링  (0) 2008.12.09
Buildr : 파일집합 복사하기  (0) 2008.12.05
Buildr : 파일 집합 선택  (0) 2008.12.01
Buildr : 의존성(dependencies) 설정하기  (4) 2008.11.19
Posted by 에코지오

댓글을 달아 주세요

지난 글에서 FileList와 glob 패턴을 이용해서 파일 집합을 선택하는 방법을 알아보았습니다. 그럼 이렇게 선택된 파일들을 다른 디렉토리에 복사하는 방법을 살펴보겠습니다. 
음... web 디렉토리내의 *.html 및 *.gif 파일들을 target/htdocs 디렉토리로 한번 복사해볼까요?

FileList['web/**/*.{html,gif}'].exclude('web/WEB-INF').each do |file|
   cp file, 'target/htdocs'
end

FileList의 파일 목록을 each로 순회하면서 cp하고 있습니다. 오 쉽군요. 그러나........
cp 메소드는 파일을 타겟 디렉토리로 복사해주긴 하는데 경로를 유지하지는 않습니다. 말하자면 web/AA/a.html 파일과 web/AA/BB/b.html 파일은 각각 target/htdocs/a.html과  target/htdocs/b.html로 복사됩니다. 경로는 다르지만 파일명이 같다면 뒤에 복사된 파일이 먼저 파일을 덮어쓰게됩니다.

우리가 원하는 건 web/AA/a.html 파일은 target/htdocs/AA/a.html 로 복사되고 web/AA/BB/b.html은 target/htdocs/AA/BB/b.html로 복사되는 것입니다.

FileList['web/**/*.{html,gif}'].exclude('web/WEB-INF').each do |file|
  target = file.sub('web','target/htdocs')
  mkdir_p File.dirname(target)
  cp file, target
end

원래 파일 경로 'web/AA/BB/b.html'에서 'web'을 'target/htdocs'로 바꾼 뒤 타켓 디렉토리를 만들고(mkdir_p) 거기에 파일을 복사해주었습니다. 그런데 좀 지저분하군요. 깔끔한 방법이 없을까요?

제가 찾아낸 방법은 buildr에서 제공하는 filter() 메소드를 이용하는 것입니다.

filter('web').into('target/htdocs').include('**/*.html', '**/*.gif').exclude('WEB-INF/**/*').run

원래 buildr의 filter는 Maven의 리소스 필터처럼 리소스 파일의 내용을 필터링하기 위한 목적으로 만들어진 것입니다만, 이런식으로 filter()를 한 디렉토리 내의 파일집합을 다른 디렉토리로 복사하는데 이용할 수 있습니다.

참고로 filter는 내부적으로 File.fnmatch를 이용하는데 File.fnmatch가 받는 패턴은 { } 표현을 지원하지 않는다고 문서에 나옵니다. 예를 들어 filter()의 include, exclude 메소드에 '**/*.{html,gif}' 패턴을 넘겨주면 *.html이나 *.gif를 찾는 것이 아니라 "{html,gif}"라는 확장자를 가진 파일을 찾게 됩니다.
또한 FileList[].exclude('web/WEB-INF')와 filter().exclude('WEB-INF/**/*')도 약간 다른 것을 볼 수 있습니다. 패턴이 제대로 적용되는지 반드시 테스트해보시기 바랍니다.

신고

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

Buildr : 리소스 교체  (3) 2008.12.09
Buildr : 리소스 필터링  (0) 2008.12.09
Buildr : 파일집합 복사하기  (0) 2008.12.05
Buildr : 파일 집합 선택  (0) 2008.12.01
Buildr : 의존성(dependencies) 설정하기  (4) 2008.11.19
Buildr : 컴파일 옵션 설정하기  (2) 2008.11.18
Posted by 에코지오

댓글을 달아 주세요



티스토리 툴바