2012. 7. 18. 09:09 IT

배경 : gradle의 pmd plugin은 rule파일을 제대로 인식하지 못하고, csv 형태의 report파일 생성을 지원하지 않음.


해결책 : ant pmd task를 호출.


// apply plugin: 'pmd'


configurations {

    pmd // for code inspection

}

dependencies {

    pmd group:'pmd', name:'pmd', version:'4.2.5'  

}


task pmd << {

def ruleFilePath =  "..... /pmd-rule.xml";

ant.mkdir(dir:project.reporting.baseDir)

def reportFile = project.reporting.baseDir.toString() + "/pmd_" + new Date().format("yyyy-MM-dd") +".csv"

def excludesFiles = "*/test/**,*/sample/**,**/*Test*.java";

def includeDir = "*/src/**";

def checkDir = "../..";


ant.taskdef(name: 'pmd', classpath:configurations.pmd.asPath, 
             classname:"net.sourceforge.pmd.ant.PMDTask" );

ant.pmd( rulesetfiles: ruleFilePath,
failonerror: false,
maxRuleViolations: 9999,
shortFilenames: true){
formatter(type: 'csv', toFile:  reportFile)
fileset(dir: checkDir, includes: includeDir, excludes: excludesFiles)
};
}

기타 : 각각 프로젝트별로 pmd report를 만들고 병합하려고 했지만... 귀찮아서 통으로 돌리고 skip. 

posted by smplnote
2012. 4. 16. 08:54 IT

- WHY?


gradle의 멀티 플로젝트 설정 가이드를 따라가면 늘 최상위 경로에 settings.gradle 을 구성하게된다.

당연히 전체 프로젝트에 대해 계층적인 구조를 가져가는 것이 상식이다.

하지만 eclipse 관점에서만 볼때, 모든 프로젝트는 항상 같은 레벨에서 관리가 된다. 

때문에 상위 경로에서 멀티 프로젝트를 관리하는 개념을 도입할때 어떻게 해야 할지 고민하게 된다.

eclipse project 단위로 형상을 관리할 경우, 상위 경로에 있는 멀티프로젝트 설정파일은 버전관리 대상에서 제외 되어 버리기 때문이다. 


물론... gradle user guide에서 설명을 안했을 뿐이지, 멀티프로젝트 관리를 반드시 계층적으로 해야 하는 것은 아니다. 


다음과 같이 설정할 수 있다.


- project-emma : multi-project관리용 root project

   settings.gradle

   build.gradle

- project-navi : child project 1. Type : java library

   build.gradle

- project-bovary : child project 2. Type: web application. it depends on project-navi

   build.gradle


[$project-emma/settings.gradle]

// define projects

include 'navi', 'bovary'


// define sub-projects location

project(':navi').projectDir = new File(rootDir, '../project-navi')

project(':bovary').projectDir = new File(rootDir, '../project-bovary')

[$project-emma/build.gradle]
// define subproject configuration
subprojects{
// define plugins
apply plugin: 'java'
repositories {
mavenCentral()
}
// set compile encoding
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
}
[$project-navi/build.gradle]
jar {
destinationDir = file("dist"); // 별도 위치에 저장하고 싶을 경우에만 명시.
}
[$project-bovari/build.gradle]
apply plugin: 'war' // compile -> war -> assemble
dependencies {
compile project(':navi') // navi project에 대한 의존성을 명시.
 }

당연하지만, 멀티프로젝트 관리용으로 빈 프로젝트를 만들어야 할 필요는 없다. (navi의 하위 경로에 지정해도 가능하다는 말임) 앞으로도 유용하게 사용할 수 있을 듯 싶음. 


posted by smplnote
2012. 4. 12. 09:14 IT

[WHY] 

eclipse에서 grails plugin을 설치하지 않고도  ant  view에서 편리하게 각각의 gradle 명령을 사용하고 싶었음.


참고한 reference를 보면 gradle이 설치되어 있고 GRADLE_HOME 환경변수가 설정된 상태를 전제로 한다.


앞글에서 설명했던 gradlew 를 이용하면 미리 gradle binary들 설치하고 환경변수를 설정하지 않고도 빌드실행이 가능해진다. 




[Prerequisite]

== gradle wrapper생성을 통해 만들어진 파일들 (3)

gradlew.bat or gradlew

gradle/wrapper/gradle-wrapper.jar

gradle/wrapper/gradle-wrapper.properties


== 실제 build를 수행할 build 파일

build.gradle

// this is sample...

apply plugin: 'java'

repositories {

mavenCentral()

}

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

jar {

destinationDir = file("dist")

}


== gradle을 수행할 ant build wrapper 

build.xml

<project name="build-gradle"  default="help"  basedir=".">

<property environment="env" />

<property name="gradle.executable" location="./gradlew.bat" /><!-- for window -->

<target name="help">

<exec executable="${gradle.executable}" dir=".">

<arg value="tasks" />

</exec>

</target>

<target name="build"> <!-- 모든 포함된 project의 build task를 실행 -->

<exec executable="${gradle.executable}" dir=".">

<arg value="build" />

</exec>

</target>

<!--

<target name="subproject-build" description=" 특정 subproject의 build task만 실행시키고 싶을때 사용">

<exec executable="${gradle.executable}" dir=".">

<arg value=":common:build" />

</exec>

</target>

-->

</project>

이제, 필요할 때마다 ant target을 추가하면된다. 



reference : https://gist.github.com/735788 

posted by smplnote
2012. 4. 12. 08:47 IT

maven이든 ant든 다른 어떤 툴이든, 우선 많은 용량의 binary를 다운 받아서 작업을 해야한다.

plugin으로 제공되는 경우도 용량 자체는 크게 다르지 않거니와 행여나 버전이 낮아 쓰기 불편한 경우도 있어

새로 시작할 때마다 부담이 되는 경우가 있다. 

gradle은 eclipse 지원을 일찍 포기한 것으로 보이는데, 상위버전에서 제공되는 명령이 제대로 먹히지 않는다.

(물론 별도의 GRADLE_HOME 을 설정할 수 있도록 preference 에서 설정화면을 제공하고 있다.)


gradle wrapper의 핵심 idea는  gradle을 설치하지 않은 상태에서도 gradle을 사용할 수 있도록 제공하는 기능이다.


물론 아무것도 없이 실행되는 것은 아니다. 

단지 최소한의 쉘스크립트와 바이너리를 통해 이 작업을 수행할 수 있다. 



먼저, gradle wrapper 스크립트를 만들기 위해서는 당연하게도 gradle이 설치되어 있는 곳에서 시작하여야 한다.

build.gradle을 다음과 같이 작성한다.

// 현재 gradle 버전은'1.0-milestone-9' 이다. 

task wrapper(type: Wrapper) {

gradleVersion = '1.0-milestone-9'

}

defaultTasks 'wrapper'


실행이 되면

쉘파일과 (윈도우용인 gradlew.bat , *nix용인  gradlew)

실행을 위한 jar (gradle/wrapper/gradle-wrapper.jar )

설정정보를 포함한 property ((gradle/wrapper/gradle-wrapper.properties)

가 만들어진다. 

(cf. 새 버전이 나올 경우 wrapper task를 실행하여 새로 생성하거나 단순히 gradle-wrapper.properties 에서 binary를 다운 받을 경로를 변경해주면 된다.)


이제 준비완료.


gradlew가 해주는 역할은 단순하다.

gradle 배포본이 있는지 체크해서 없으면 gradle-wrapper.properties에 정의되어 있는 경로에서 다운로드를 받고,

있을 경우에는 모든 argument를 gradle 에게 전달한다. 


현재 gradle-1.0-milestone-9-bin.zip의 크기는 29M다. ( gradle-wrapper.jar 는 39K )


기본으로 설치되는 위치는 

$USER_HOME/.gradle/wrapper/dists


이제 신규 프로젝트에

저 파일을 같이 포함하면 준비완료.

gradlew 를 실행하면 된다. 



reference : http://www.gradle.org/docs/current/userguide/gradle_wrapper.html


posted by smplnote