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


97

여러 환경에 여러 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 빌드 파일이있는 여러 하위 프로젝트로 구성된 모든 대규모 프로젝트에서 사용할 수있는 파일입니다.


3
외부 선언을 가져 오려면 "apply from : 'other.gradle'"구문을 고려하십시오. ( "12.4. 외부 빌드 스크립트를 사용하여 프로젝트 구성"여기 gradle.org/0.9-preview-1/docs/userguide/… 참조 )
Petr Gladkikh

@PetrGladkikh는 apply from즉시 외부 작업을 실행합니다. 이것은 실행 로직에서 바람직하지 않을 수 있습니다 (즉, 즉시가 아니라 원할 때 작업을 실행하고 싶습니다).
IgorGanapolsky

위의 코멘트에이 문장은 사실이 아니다 : apply from즉시 외부 작업을 실행합니다. 오해하지 마십시오. 외부 작업은 실행되지 않고 구성됩니다.
Jarekczek

답변:



17

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

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


링크가 끊어 졌다는 것을 알 수 있습니다. 여기에 업데이트가 있습니다. gradle.org/docs/current/userguide/…
JARC


4

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

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

프로젝트 루트에서 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을 자동으로 여러 파일에서 수행 모든 정의를 고려할 것입니다.

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


1
시간을내어 답변 해 주셔서 감사합니다. 문제가있는 하위 프로젝트가 아니라 일반적인 작업의 '라이브러리'를 만듭니다. 더 명확하게하기 위해 더 많은 정보와 코드 조각으로 원래 질문을 편집했습니다.
Anthony Roy

1
따라서 샘플에서 import ( "tasks.gradle")를 수행하는 대신 모든 하위 프로젝트에서 사용하는 일반 작업 생성 코드를 지정하는 subprojects {} 섹션이 있습니다. 이것은 당신이 찾고있는 것과 동일한 추상화를 제공해야합니다!?
Tom

여기에 아이비 플러그인이 정말 필요합니까? Gradle은 단독으로 사용할 수 없습니까?
IgorGanapolsky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.