[문법] 개미 잡자~!!

2012. 10. 5. 16:47CM/Ant

반응형



1.  ant의 주요 옵션에 대해 알아보자.
옵션 설명
-help 도움말을 출력한다.
-projecthelp 프로젝트의 도움말 정보를 출력한다.
-version 버전 정보를 출력한다.
-quiet 적은 양의 메시지를 출력한다.
-verbose 추가적인 메시지를 출력한다.
-debug 디버깅 정보를 출력한다.
-logfile file 로그 메시지를 file에 기록한다.
-buildfile file 지정한 file을 빌드 파일로 사용한다.
-Dproperty=value 이름이 property인 프로퍼티의 값을 value로 지정한다.

빌드파일로 build.xml이 아닌 acetbuild.xml을 사용하고 싶다면!! 또한, 작업대상을 flavio로 하고 싶다면!

--> ant -buildfile acetbuild.xml flavio

또한, 파라미터 즉 인자를 넣고 싶다면!!
--> ant -buildfile acetbuild.xml -Dhahahaha=$testparm flavio
으로 해주면 된다. $testparm은 동적으로 값을 받은 것!


2. ANT의 사용

형태는 다음과 같다.
<project name="프로젝트이름" default="기본타겟이름" basedir="." >
    
    <target name="타겟이름">
      <property name="프로퍼티이름1" value="프로퍼티값1"/>
      <property name="프로퍼티이름2" value="프로퍼티값2"/>
    </target>
  
    <target name="타겟이름1">
      <task명/>
      <task명1 dir="${build}"/>
      <property name="프로퍼티이름3" value="프로퍼티값3"/>
    </target>
  
    <target name="타겟이름2" depends="타겟이름1">
      <태스크명2 속성1="값1" 속성2="값2"/>
    </target>
  
  </project>
앞으로 빌드를 하기 위해 build.xml 즉, 빌드에 필요한 xml 파일을 알맞게 작성을 해야한다.

위에서 중요하게 봐야 할 것은 붉은표시가 되어있는 project, target, property, task명 이다.

2-1. project
프로젝트에 대해서 알아보자^-^good~
<project> tag는
   1) 빌드파일의 루트tag!!
   2) 모든 빌드파일은 하나의 project tag를 가진다!!
   3) project tag는 프로젝트를 설명하기 위해 다음고 같은 속성을 사용한다.

속성 설명 필수여부
      name 프로젝트의 이름       필수아님
     default ant.bat 파일을 실행할 때 [타겟]이 지정되지 않을 때 기본적으로 사용할 타겟        필수
     basedir 경로 계산을 할 때 사용할 기본 디렉토리. basedir 프로퍼티를 지정했을 경우, 그 값을 이 속성에서 지정한 값으로 대체한다.만약 이 속성도 지정하지 않고 basedir 프로퍼티도 지정하지 않았을 경우에는 빌드 파일이 위치하는 디렉토리를 기본 디렉토리로 사용한다.      필수 아님

       ※ ant 수행 시 target을 정해주지 않으면 default가 수행 된다.

2-2. target
<target> 태그는 <project> 태그에 포함되며, 실제로 프로젝트가 수행하게 될 작업(태스크)을 지정한다. <target> 태그의 기본 구조는 다음과 같다.
    <target name="타겟이름1">
      <task명/>
      <task1 dir="${build}"/>
      <property name="프로퍼티이름3" value="프로퍼티값3"/>
    </target>
특징
  1) 하나의 <project>에 여러 개의 <target> 포함 가능.
  2) <target> 태그는 그 타켓을 통해 수행하고자 하는 태스크(작업)을 명시 한다.
     => 그냥 target 만 선언하고 task를 명시 하지 않고 그냥 command를 수행 할 수도 있다!
     <target name="stage-workspace">
         <echo message="Cleaning Staging Directory: ${staging-dir}"/>
         <delete dir="${staging-dir}" quiet="true"/>
      </target>
  3) 의존관계가 있다.

[참고1]
    <target name="compile">
      ...
    </target>

    <target name="apidoc">
      ...
    </target>

    <target name="makeproduct">
      ...
    </target>

 ex) 위처럼 여러개의 타겟이 있다고 치면,
아래는 반드시 compile -> apidoc -> makeproduct로 수행 된다고 하면 각각의 타켓 순서는
compile target, apidoc target, makeproduct target 이 된다.
즉, apidoc target은 compile에 의존하고, makeproduct target은 apidoc target에 의존하게 된다.
이러한 의존관계는 <target> 태그의 depends 속성을 통해 지정 할 수 있다.

ex)

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

여기서 여러분이 최종적으로 실행하고자 타겟이 D라고 해 보자. 이 때, 타겟 D의 depends 속성의 값은 "C,B,A"인데 이는 타겟 D를 실행하기 위해서는 먼저 타겟 C, B, A가 수행되어야 함을 의미한다. 이때 타겟 C, B, A가 수행되는 순서는 depends 속성에 표시된 순서대로 수행되게 된다. 즉, 타겟 D를 실행하면 타겟 C가 먼저 실행되고, 그 다음 타겟 B, 그 다음 타겟 A, 그리고 마지막으로 타겟 D가 실행된다.

즉, [참고1]은 다음과 같이 변형이 가능하다.

   <target name="compile">
      ...
    </target>

    <target name="apidoc" depends="compile">
      ...
    </target>

    <target name="makeproduct" depends="apidoc">
      ...
    </target>

   4) target 태그의 설명은 description 속성을 통해서 할 수 있다. description 속성에 명시한 값은 ant.bat을
      실행할 때 명령행 옵션인 -projecthelp를 통해서 볼 수 있다.

2-3. task
    target이 각 수행할 작업간의 의존관계나 수행 조건 등을 표시한다면!!
    task는 타켓 내에서 실제로 수행할 작업을 나타낸다!!  

"여러분은 태스크를 통해서 소스 코드를 컴파일하고 파일을 복사/삭제하고 API 문서를 생성할 수 있다. "


anyway~!

구조는 다음과 같다. task의 구조!
  <태스크명 속성1="값1" 속성2="값2" ... />

'태스크명'은 태스크의 이름을 나타내고 '속성n'과 '값n'은 각각 태스크를 처리할 때 사용할 속성값을
 나타낸다.

ex) <delete dir="${staging-dir}" quiet="true"/>

Task는 
  1) 이미 만들어져 있는 빌트인(built-in) 태스크를 사용 가능
  2) 추가적으로 제공되는 옵션(optional) 태스크를 사용 가능
  3) 직접 작성한 태스크를 사용 가능

예를 들어, 빌트인 태스크인 javac를 사용하여 소스 코드를 컴파일 할 때는 다음과 같이 <target> 태그에 javac 태스크를 중첩시키면 된다.

  <target name="compile" depends="init">
     <javac srcdir="${src}"
            destdir="${build}"
            classpath="jcorelogging.jar"  />
  </target>

위 코드에서 <javac src="${src}" ... /> 태그가 <target> 태그에 중첩되어 있는 것을 알 수 있는데,
이때 javac는 태스크명을 나타내며, srcdir과 destdir, classpath는 각각 javac 태스크에서 사용되는 속성을 나타낸다. 그리고 각 속성의 값 중, "${"로 시작하고 "}"로 끝나는 것이 있는데 이는 프로퍼티를 나타내는 것으로서 "${"와 "}" 사이에 있는 문자열의 프로퍼티의 이름이다. 그냥 값이라보면 된다.

2-4. property
프로젝트를 진행하다보면 다양한 프로퍼티를 사용하게 된다.
컴파일 할 소스 코드의 위치, 컴파일 된 클래스 파일을 저장할 디렉토리, 압축한 파일을 위치시킬 디렉토리 등 유연한 개발을 위해서는 다양한 프로퍼티의 사용이 필수적이라 할 수 있다.

Ant는 이처럼 빌드 과정에서 사용되는 다양한 프로퍼티를 지정할 수 있도록 하고 있으며,
또한 몇몇 개의 빌트인 프로퍼티를 제공하고 있다.

프로퍼티의 지정은 property 태스크를 통해서 할 수 있으며, property 태스크는 표4와 같은 속성을 갖고 있다.

표4 - property 태스크의 속성
속성 설명 필수여부
name 설정할 프로퍼티의 이름 필수아님
value 프로퍼티의 값 name 속성을 사용할 경우 세 속성중의 하나를 지정해야 한다.
location 프로퍼티를 주어진 파일의 절대 파일명으로 지정한다. 이 속성의 값이 절대 경로일 경우, '/'나 '\'와 같은 구분자는 현재 플래폼에 알맞게 처리된다. 절대 경로가 아닐 경우 프로젝트의 basedir에 상대적인 경로로 처리된다.
refid 다른 곳에서 정의된 객체를 참조한다.
resource 프로퍼티 파일을 나타내는 자원의 이름 name 속성을 사용하지 않을 때 이 세 속성중의 한 개를 사용해야 한다.
file 프로퍼티 파일의 파일 이름
environment 환경 변수를 읽을 때 사용할 접두어. 만약 environment="myenv"라고 지정했다면, OS에 종속적인 환경변수인 PATH나 TEMP와 같은 값을 "myenv.PATH"나 "myenv.TEMP"와 같은 프로퍼티 이름을 사용하여 구할 수 있다.
classpath 자원을 검색할 때 사용할 클래스패스 필수아님
classpathref 다른 곳에서 정의된 PATH에 대한 참조로서 주어진 자원을 검색할 때 사용할 클래스패스 필수아님

예를 들어, "buildno" 속성의 값을 "356"으로 지정하고 싶다면 다음과 같이 하면 된다.

  <property name="buildno" value="356"/>

또한, 특정한 파일에 저장된 프로퍼티를 사용하고 싶다면 다음과 같이 file 속성을 사용하면 된다.

  <property file="build355.properties" />

Ant의 빌드 파일에서는 자바에서 기본적으로 제공하는 "java.version"과 같은 시스템 프로퍼티를 기본적으로 사용할 수 있으며, 추가적으로 Ant 자체에서 기본적으로 제공하는 프로퍼티를 사용할 수 있다. Ant가 기본적으로 제공하는 프로퍼티 목록은 다음표와 같다.

표5 - Ant가 기본적으로 제공하는 프로퍼티 목록
프로퍼티 설명
basedir 프로젝트의 기본 디렉토리에 대한 절대 경로. <project> 태그의 basedir 속성값을 사용한다.
ant.file 빌드 파일의 절대 경로
ant.version Ant의 버전
ant.project.name 현재 실행중인 프로젝트의 이름. <project> 태그의 name 속성값을 사용한다.
ant.java.version Ant가 발견한 Java의 버전

프로퍼티는 특정한 타켓에서만 사용되도록 지정할 수도 있고 전체에서 사용되도록 지정할 수도 있다. 다음 예를 살펴보자.

  <project name="MyProject" default="dist" basedir=".">
  
    <!-- 빌드를 위한 글로벌 프로퍼티 -->
    <property name="build" value="build"/>
    <property name="dist"  value="dist"/>
  
    <target name="init">
      <!-- init 타켓 내에서 프로퍼티 지정 -->
      <property name="src" value="."/>
      <mkdir dir="${build}"/>
    </target>
  
    <target name="compile" depends="init">
      <javac srcdir="${src}" destdir="${build}"/>
    </target>
  
    <target name="dist" depends="compile">
      <mkdir dir="${dist}/lib"/>
  
      <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
    </target>
  
    <target name="clean">
      <delete dir="${build}"/>
      <delete dir="${dist}"/>
    </target>
  </project>


위 빌드 파일을 보면 build, dist 프로퍼티는 프로젝트 전체에서 사용될 수 있는 프로퍼티로서
빌드 파일의 어떤 곳에서든지 사용될 수 있다. 반면에 init 타켓 내에 정의된 src 프로퍼티는 init 타켓에
직간접적으로 의존하고 있는 타켓에서만 사용될 수 있다.
위 코드에서는 init 타켓에 의존하고 있는 compile 타켓에서 src 프로퍼티를 사용할 수 있음을 알 수 있다.
또한 간접적으로 init 타겟에 의존하고 있는 dist 타겟 역시 src 프로퍼티를 사용하고 있다.

더 많은 내용이 있지만 기본적으로 위의 내용들을 숙지하면 될 것 같다^-^good~



참고 사이트 : http://timeless0312.blogspot.kr/2008/09/apache-ant%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B9%8C%EB%93%9C%EC%9E%90%EB%8F%99%ED%99%94.html
반응형

'CM > Ant' 카테고리의 다른 글

Hello World 찍기! & for 루프 사용!!  (0) 2012.10.05
ANT 셋팅  (0) 2012.02.15
tar.gz 압축 풀기  (4) 2012.02.15