[gradle] Gradle 빌드 스크립트에서 일반적인 메서드 추출

build.gradle몇 가지 작업을 만든 Gradle 빌드 스크립트 ( )가 있습니다. 이러한 작업은 대부분 메서드 호출로 구성됩니다. 호출 된 메서드는 빌드 스크립트에도 있습니다.

이제 상황은 다음과 같습니다.

나는 다른 작업을 포함하지만 원본 스크립트와 동일한 방법을 사용하는 상당한 양의 빌드 스크립트를 만들고 있습니다. 따라서 이러한 “일반적인 방법”을 어떤 식 으로든 추출하여 새로 만드는 스크립트마다 복사하는 대신 쉽게 재사용 할 수 있습니다.

Gradle이 PHP라면 다음과 같은 것이 이상적입니다.

//script content
...
require("common-methods.gradle");
...
//more script content

하지만 물론 불가능합니다. 아니면?

어쨌든이 결과를 어떻게 얻을 수 있습니까? 이를 수행하는 가장 좋은 방법은 무엇입니까? 이미 Gradle 문서를 읽었지만 어떤 방법이 가장 쉽고 가장 적합한 지 결정할 수없는 것 같습니다.

미리 감사드립니다!


최신 정보:

다른 파일에서 메서드를 추출했습니다.

(사용 apply from: 'common-methods.gradle'),

따라서 구조는 다음과 같습니다.

parent/
      /build.gradle              // The original build script
      /common-methods.gradle     // The extracted methods
      /gradle.properties         // Properties used by the build script

에서 작업을 실행 한 후 build.gradle새로운 문제에 부딪 혔습니다. 분명히 메서드가 .NET에있을 때 인식되지 않습니다 common-methods.gradle.

그것을 고치는 방법에 대한 아이디어가 있습니까?



답변

메서드를 공유하는 것은 불가능하지만 클로저를 포함하는 추가 속성을 공유 할 수 있습니다. 예를 들어, 선언 ext.foo = { ... }common-methods.gradle사용 apply from:스크립트를 적용하고 다음에 폐쇄를 호출 foo().


답변

베드로의 대답을 바탕으로 과 같이 방법을 내 보냅니다.

내용 helpers/common-methods.gradle:

// Define methods as usual
def commonMethod1(param) {
    return true
}
def commonMethod2(param) {
    return true
}

// Export methods by turning them into closures
ext {
    commonMethod1 = this.&commonMethod1
    otherNameForMethod2 = this.&commonMethod2
}

그리고 이것은 다른 스크립트에서 이러한 방법을 사용하는 방법입니다.

// Use double-quotes, otherwise $ won't work
apply from: "$rootDir/helpers/common-methods.gradle"

// You can also use URLs
//apply from: "https://bitbucket.org/mb/build_scripts/raw/master/common-methods.gradle"

task myBuildTask {
    def myVar = commonMethod1("parameter1")
    otherNameForMethod2(myVar)
}

Groovy에서 메서드를 클로저로 변환하는 방법에 대한 자세한 내용다음과 같습니다 .


답변

Kotlin dsl을 사용하면 다음 과 같이 작동합니다.

build.gradle.kts :

apply {
  from("external.gradle.kts")
}

val foo = extra["foo"] as () -> Unit
foo()

external.gradle.kts :

extra["foo"] = fun() {
  println("Hello world!")
}


답변

Kotlin DSL의 또 다른 접근 방식은 다음과 같습니다.

my-plugin.gradle.kts

extra["sum"] = { x: Int, y: Int -> x + y }

settings.gradle.kts

@Suppress("unchecked_cast", "nothing_to_inline")
inline fun <T> uncheckedCast(target: Any?): T = target as T

apply("my-plugin.gradle.kts")

val sum = uncheckedCast<(Int, Int) -> Int>(extra["sum"])

println(sum(1, 2))


답변