Ant – fileset, dirset을 이용한 copy, delete시 유의사항

Ant script를 작성 경험 상, Ant script에서 가장 많이 사용하는 타스크는 컴파일을 수행하는 javac가 아니라 copy, delete, mkdir 등과 같이 리소스(파일, 디렉토리)를 다루는 타스크라 생각됩니다.
리소스를 다루는 타스크는 그리 사용이 어렵지는 않지만, 일반적으로 자주 실수 하기 쉬운 부분이 있어, 나중에 스크립트를 수정해야 하는 지경에 이를 수 있습니다.(수정하는 것이 그리 뭐 어려운 일은 아니지만, 운영하는 시점에서 다수의 빌드 서버에 올라가 있는 스크립트를 수정하는 것은 좀 번거롭습니다.)
어렵거나 모르는 내용이 결코 아니지만, 간과하기 쉬운 부분이라 글로 남겨봅니다.

1.copy 할 때, overwrite, force, verbose 속성
copy는 기본적으로 타겟파일이 존재하지 않거나, 타겟파일이 존재하더라도 타겟파일의  timestamp가 소스파일의 timestmp보다 이전일 때만 덮어쓰기가 됩니다..
(Copies a file or resource collection to a new file or directory. By default, files are only copied if the source file is newer than the destination file, or when the destination file does not exist.)
즉, 동일한 경로에 동일한 이름의 파일이 있을 경우, 덮어쓰고(overwrite)자 하는 파일이 기존에 있는 파일보다 날짜가 최신일 경우에만 덮어쓰기가 되는 거죠. 기존에 있는 파일이 더 최신인 경우(이런 경우는 드물지만, 충분히 발생할 수 있습니다.), 덮어쓰기가 되지 않으며, 덮어쓰기가 되지 않아도 Build Sucessful 이 떨어집니다.
이렇게 덮어쓰기가 되지 않아도 Build Successful이 떨어지면, 실제 운영 중에 원인이나 증상을 발견하기도 어려우며, 이로 인해 나중에 큰 문제를 야기할 수 있는 소지가 있습니다.

  • 이러한 문제를 방지하기 위해 파일 존재여부, timestamp여부와 관계없이 무조건 복사(=덮어쓰기) 할려면 overwrite=”true”를 세팅합시다.(기본값은 false임)
  • 기존에 존재하는 파일이 readonly파일도 덮어 쓰기 해야 한다면 force=”true”를 세팅합시다.
  • 실제 운영중에 어떤 파일이 copy가 되었는지 빌드 로그를 보고 확인할 수 있도록 verbose=”true”도 반드시 세팅합시다
  • 파일의 timestamp비교할 때 파일 시스템마다 편차  있을 수 있으니 주의하십다. granularity 속성 참조.

2.fileset에서 dir 속성
아래 첫번째 예제에서, 처음에 디렉토리를 복사할 때 C:\yourDir 하위에 sub_dir이 없으면, c:/myDir 하위로 sub_dir은 복사되지 않을 겁니다(이경우는 정상적으로 충분히 발생 가능). 하지만 그 다음에 해당 디렉토리를 삭제하는 부분에서 delete 타스크의 dir속성에 세팅된 “c:/myDir/sub_dir” 디렉토리는 존재할 수 도 있고, 존재하지 않을 수 도 있습니다. 존재할 경우에야 문제없이 삭제가 되겠지만, 존재하지 않는다면 에러가 발생합니다.  일반적으로 빌드스크립트 작성 후 테스트 수행 시 별 문제가 발생하지 않지마, 나중에 운영중에 묘하게 상황이 꼬이면 숨어있던 오류가 발생할 수 있습니다.

delete, copy등 fileset을 이용한 타스크의 dir속성에는 들어가는 속성은 해당 타스크가 수행되는 시점에서 항상 존재한다는 것이 보장되어야 합니다. 특히 스크립트 상에서 동적으로 생성,삭제되는 경로가 dir속성에 세팅될 때는 주의해야 합니다.

아래 첫번째 사례의 경우 두번째 예제처럼 바꿔쓰면 문제가 발생하지 않습니다.

<target name="copy.test">
    <copy dir="c:/myDir">
        <fileset dir="c:/yourDir" includes="sub_dir/**/*">
    </copy>
    <!-- .... -->
    <delete dir="c:/myDir/sub_dir" 
                 verbose="true" overwrite="true" force="true" />
</target>
<target name="copy.test">
    <copy dir="c:/myDir">
        <fileset dir="c:/yourDir" includes="sub_dir/**/*" /> 
    </copy>
    <!-- .... -->
    <delete  verbose="true" overwrite="true" force="true" >
        <fileset dir="c:/myDir" includes="sub_dir/**"/>
    </delete>
</target>

“Ant – fileset, dirset을 이용한 copy, delete시 유의사항”의 2개의 댓글

  1. ant build 사용하는데 이상하게도 svn에서 업데이트한 소스가 한번씩
    war에 반영이 안되어서 문제가 있었는데 덕분에 잘 알고 갑니다.
    감사합니다. ^^

  2. 핑백: ant file copy 옵션 주의사항 | HADOOH

댓글 남기기