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)
}
답변
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))