2012-10-16 6 views
1

Gradle에서 두 가지 구성 작업이 필요할 수있는 작업을 어떻게 분리합니까? 내가 buildSrc/dbhelpertasks.gradle 파일에서 부모 build.gradle 파일에서 실행하려는 실제 작업을 분리하려고합니다. build.gradle은 dbhelpertasks.gradle에서 사용되는 부분적으로 구성된 태스크를 포함합니다.Gradle의 작업 유형에 대한 상속 트리

데이터베이스 이름과 URL을 사용하는 SQLServerTask를 만들려고 여러 개의 다른 데이터베이스를 연결하고 SQL을 실행하려고합니다.

사용자 정의 SQLServerTask.groovy

 
import org.gradle.api.DefaultTask 
import org.gradle.api.tasks.TaskAction 
import groovy.sql.Sql 


class SQLServerTask extends DefaultTask { 
    def hostname 
    def database 
    def port = 1433 
    def username 
    def password 
    def sql 
    def sqlServerDriver = 'net.sourceforge.jtds.jdbc.Driver' 

    @TaskAction 
    def executeSql() { 
     url = hostname + ":" + port + "/" + database 
     databaseConnProps = [user: username, password: password] 
     def sqlInstance = Sql.newInstance(url, databaseConnProps, sqlServerDriver) 
     println "I would execute " + sql 
    } 

} 

나는 다음 속성 중 일부와 함께 SQLServerTask를 구성 할 것입니다 내 build.gradle에서 작업을 만들었습니다.

build.gradle

 
import groovy.sql.Sql 
apply from: 'buildSrc/dbhelpertasks.gradle' 
repositories { 
    mavenCentral() 
} 

configurations { 
    driver 
} 

dependencies { 
    driver group: 'net.sourceforge.jtds', name: "jtds", version: "1.2.4" 
} 

//Load up all the drivers for use in this project 
URLClassLoader loader = GroovyObject.class.classLoader 
configurations.driver.each {File file -> 
    loader.addURL(file.toURL()) 
} 

task contentDbTask(type: SQLServerTask) { 
    println "Configuring content db task" 
    hostname = contentDbUrl 
    database = contentDbName 
    username = contentDbUserName 
    password = contentDbPassword 
} 

dbhelpertasks.gradle 파일 내가 실행하고자하는 실제 작업의 최종 구성 (SQL 문)이 포함되어 있습니다. 내가 gradle getSiteParams을 실행하면

 
task getSiteParams(type: contentDbTask) { 
    println "Configuring Site Params Task" 
    sql = "SELECT * FROM CMS_SITE_PARAM" 
} 

dbhelpertasks.gradle

buildSrc/그것은 오해의 숫자가 여기에 있습니다

 
* What went wrong: 
A problem occurred evaluating script. 
> Could not find property 'contentDbTask' on root project 'shipyard'. 

답변

0

실패 끝납니다.

먼저 클래스는 buildSrc이어야하며 buildSrc의 유일한 목적은 기본 빌드에서 사용되는 클래스를 생성하는 것입니다.

dbhelpertasks.grovvy은 일반적으로 gradle 디렉토리 (형제는 buildSrc)이며 .gradle으로 끝납니다. contentDbTask과 같은 작업의 사전 구성은 일반적으로 작업이 아닌 플러그인 (예 : dbhelpertasks.gradle 스크립트 플러그인)에 의해 수행됩니다.

작업 유형은 항상 클래스이므로 task getSiteParams(type: contentDbTask)은 작동하지 않습니다. 또한 dbhelpertasks.groovy은 추가 된 작업 (또는 다른 구성 작업)을 build.gradle으로 볼 수 없으며 그 반대의 경우에만 볼 수 있습니다. 왜냐하면 후자는 전자를 맨 위에 적용하기 때문입니다 (괜찮습니다).

+0

피터 감사합니다. dbhelpertasks.gradle 이름에 실수가있었습니다. 실제로 .groovy가 아닙니다. 나는 당신의 제안을 따라 gradle 디렉토리 (buildSrc의 형제)로 옮겼다. 나는 당신의 제안에 따라 작업을 플러그인에 의해 미리 구성하고 getSiteParams를 해당 플러그인의 유형으로 변경합니다. 플러그인이 dbhelpertasks.gradle에 있고 gradle.properties에 액세스 할 수 있습니까? –

+0

'dbhelpertasks.gradle' *은 * (스크립트) 플러그인입니다. 바이너리 플러그인으로 변환 할 필요는 없습니다 (즉,'플러그인'인터페이스 구현). 'gradle.properties'는 직접 액세스되지 않습니다; 대신에,'gradle.properties'의 모든 속성은 자동으로'project' 객체의 속성이됩니다. 그러므로'dbhelpertasks.gradle'은 그것들 모두에 접근 할 수 있습니다. –

+0

그래, contentDbTask를 설정할 수있는 플러그인을 만들거야. 내가 잃어버린 부분은 최종 사용자 지정 구성으로 사전 구성된 작업을 다시 사용하는 방법입니다. 미리 구성한 작업을 플러그인에서 만들 수도 있습니다. 구성을 마무리하고 사용자 지정 SQL 작업으로 여러 번 작업을 여러 번 재사용하는 방법에 대해 궁금합니다.예를 들어, 미리 연결 정보가있는 ContentDbTask를 얻었 으면 DAG의 다른 SQL 문으로 해당 작업을 실행하고 싶습니다. –

관련 문제