[java] 하나의 Gradle 스크립트를 다른 스크립트로 어떻게 가져올 수 있습니까?

여러 환경에 여러 netbeans 프로젝트를 빌드하고 배포하는 것과 관련된 많은 기능을 래핑하는 복잡한 gradle 스크립트가 있습니다.

스크립트는 매우 잘 작동하지만 본질적으로 프로젝트 및 환경 정보를 포함하는 6 개의 맵을 통해 구성됩니다.

작업을 다른 파일로 추상화하여 간단한 빌드 파일에 맵을 정의하고 다른 파일에서 작업을 가져올 수 있습니다. 이러한 방식으로 여러 프로젝트에 동일한 핵심 작업을 사용하고 간단한 맵 세트로 해당 프로젝트를 구성 할 수 있습니다.

누구든지 Ant의 작업과 비슷한 방식으로 gradle 파일을 다른 파일로 가져올 수있는 방법을 알려줄 수 있습니까? 지금까지 Gradle의 문서를 아무 소용이 없었습니다.

추가 정보

아래 톰의 답변 후, 나는 내가 의미하는 바를 정확히 밝히려고 노력할 것이라고 생각했습니다.

기본적으로 여러 하위 프로젝트를 실행하는 gradle 스크립트가 있습니다. 그러나 하위 프로젝트는 모두 Netbeans 프로젝트이며 자체 ant 빌드 스크립트와 함께 제공되므로 각 프로젝트를 호출하는 작업이 gradle에 있습니다.

내 문제는 파일 상단에 다음과 같은 구성이 있다는 것입니다.

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

그런 다음 다음과 같은 작업을 생성합니다.

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

나는 이러한 종류의 작업 생성 스 니펫을 많이 가지고 있으며 모두 일반적입니다. 프로젝트 목록의 구성에 전적으로 의존합니다.

그래서 제가 원하는 것은 이것을 별도의 스크립트에 넣고 다음과 같은 방식으로 가져 오는 방법입니다.

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

따라서이 예제에서 tasks.gradle은 모든 일반 작업 생성 코드를 포함하고 기본 build.gradle 파일에 정의 된 프로젝트에 대해 실행됩니다. 이러한 방식으로 tasks.gradle은 Netbeans ant 빌드 파일이있는 여러 하위 프로젝트로 구성된 모든 대규모 프로젝트에서 사용할 수있는 파일입니다.



답변

0.9에 새로운 기능이 있습니다. apply from: 'other.gradle'명령 을 사용할 수 있습니다 .

같은 것에 대한 내 질문을 읽으십시오 : Gradle 빌드의 공통 부분을 분할 / 팩터링하는 방법이 있습니까?


답변

질문에 대한 답은 플러그인 시스템에있는 것으로 밝혀졌습니다. 여기서 원하는 기능을 플러그인 집합에 추가 할 수 있습니다.이 시스템은 디렉토리에있는 멋진 파일 일 수 있습니다 buildSrc/src/main/groovy. 플러그인은 시도하지 않았지만 Jar로 묶을 수도 있습니다.

여기에 세부 정보 : 사용자 정의 플러그인


답변

글쎄, 실제로 빌드 파일을 보지 않고 가장 적합한 것이 무엇인지 말하기는 어렵습니다.

다중 프로젝트 빌드로 환경을 조정하면 원하는 추상화를 제공 할 수 있다고 가정 할 수 있습니다.

프로젝트 루트에서 build.gradle모든 도메인 관련 항목과 모든 하위 프로젝트에 적용되는 항목을 정의 합니다.

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

프로젝트 루트 디렉터리에는 gradle.properties프로젝트에서 사용하는 속성을 정의 하는 파일 도 포함될 수 있습니다.

buildDirName=staging
repo.dest.dir=/var/repo
...

그런 다음 프로젝트 루트의 추가 파일에서 settings.gradle실제로 하위 프로젝트를 가리 킵니다.

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

각 하위 프로젝트 디렉토리에는 build.gradle하위 프로젝트 관련 항목 만 포함 된 파일이 있습니다.

아무리 당신이 호출 할 경우 gradle프로젝트 루트 또는 하위 프로젝트 디렉토리에서, Gradle을 자동으로 여러 파일에서 수행 모든 정의를 고려할 것입니다.

또한 루트 수준에서 기본 플러그인 이외의 플러그인을로드하지 않는 한 프로젝트 루트에 대해 컴파일 작업이 실행되지 않습니다.


답변