我开始从build.gradle(Groovy)迁移到build.gradle.kts(Kotlin DSL)。问题是com.google.common.util.concurrent.ListenableFuture(from com.google.guava) 存在于几个依赖项中。由于该构建失败并java.lang.RuntimeException: Duplicate class ...出现错误。
以前(当我build.gradle在 Groovy 中时)这个问题是用这个片段解决的:
configurations {
all*.exclude group: 'com.google.guava', module: 'listenablefuture'
}
Run Code Online (Sandbox Code Playgroud)
但是我使用 Kotlin DSL 找不到任何类似的东西。您能否为上面的代码片段提供 Kotlin 替代方案,或者建议任何其他解决方案来解决这个问题?
这基本上将这个问题扩展到 Kotlin DSL 而不是 Groovy DSL:
如何在Groovy的DSL解决方案的
if (hasProperty('buildScan')) {
buildScan {
termsOfServiceUrl = 'https://gradle.com/terms-of-service'
termsOfServiceAgree = 'yes'
}
}
Run Code Online (Sandbox Code Playgroud)
转换为 Kotlin DSL?
我正在运行的问题是“buildScan”扩展或com.gradle.scan.plugin.BuildScanExtension类不能静态使用,因为它们存在或不存在取决于--scan命令行参数是否提供给 Gradle。
我试过了
if (hasProperty("buildScan")) {
extensions.configure("buildScan") {
termsOfServiceUrl = "https://gradle.com/terms-of-service"
termsOfServiceAgree = "yes"
}
}
Run Code Online (Sandbox Code Playgroud)
但正如预期的那样termsOfServiceUrl并termsOfServiceAgree没有解决,但是我不知道在这里使用什么语法。
在里面build.gradle我们可以
productFlavors {
free {
dimension "tier"
}
}
Run Code Online (Sandbox Code Playgroud)
然后
dependencies { freeDebugImplementation "com.someDependency:free-debug:1.0.0";}
Run Code Online (Sandbox Code Playgroud)
但是当我使用Kotlin DSL, inside 时build.gradle.kts,我
productFlavors { create("free") {...} }
Run Code Online (Sandbox Code Playgroud)
然后在dependencies我不能
dependencies { freeImplementation(...)}
Run Code Online (Sandbox Code Playgroud)
错误:^ Unresolved reference: freeImplementation
那么,我如何implementation通过 Kotlin DSL 获得特定的风格?
我有一个很大的 gradle.build.kts 文件,我试图使用 apply(from = "xxx") 将其分成更小的部分(如果存在更好的解决方案,我愿意接受)。
问题是我遇到了一个问题,我的脚本之一无法处理变量。这是示例代码:
构建.gradle.kts
plugins { java }
repositories { mavenCentral() }
dependencies { testCompile("junit", "junit", "4.12") }
println("Before Apply")
apply(from = "./build.gradle.test.kts")
println("After Apply")
Run Code Online (Sandbox Code Playgroud)
构建.gradle.test.kts
println("Applying")
tasks.test {
val failedTests = mutableListOf<TestDescriptor>()
}
println("Applied")
Run Code Online (Sandbox Code Playgroud)
这两个文件都位于根项目文件夹中。
输出...
>gradle clean build test
> Configure project :
Before Apply
FAILURE: Build failed with an exception.
* Where:
Build file 'D:\Users\jamesdmcmillian\Projects\FacilitatorLabs\Labs\gradle-dsl-script-variables\build.gradle.kts' line: 6
* What went wrong:
Could not open cp_dsl generic class cache for script 'D:\Users\jamesdmcmillian\Projects\FacilitatorLabs\Labs\gradle-dsl-script-variables\build.gradle.test.kts' (C:\Users\jamesdmcmillian\.gradle\caches\6.8\scripts\7kclhsg56vjpfm1z90j …Run Code Online (Sandbox Code Playgroud) 很少有 Kotlin 扩展带有org.gradle.kotlin.dsl类似
android或publishing等。比如说, for publishing,扩展定义如下
fun org.gradle.api.Project.`publishing`(configure: org.gradle.api.publish.PublishingExtension.() -> Unit): Unit =
(this as org.gradle.api.plugins.ExtensionAware).extensions.configure("publishing", configure)
Run Code Online (Sandbox Code Playgroud)
这意味着在我的范围内build.gradle.kts我可以打电话
publishing {
// blablabla
}
Run Code Online (Sandbox Code Playgroud)
就我而言,我有一个单独的文件来处理定义为的发布random.gradle.kts,并且位于完全随机的目录中。
在这里,我想访问这个publishing扩展,但无法做到。
欢迎任何建议。
再举个例子android也是不可访问的。在我的build.gradle.kts我可以访问android,但在我的random.gradle.kts我无法做到这一点。
android扩展名定义如下
val org.gradle.api.Project.`android`: com.android.build.gradle.LibraryExtension get() =
(this as org.gradle.api.plugins.ExtensionAware).extensions.getByName("android") as com.android.build.gradle.LibraryExtension
Run Code Online (Sandbox Code Playgroud)
事实上,LibraryExtension也是不可访问的。
那么,如何将这些扩展传递或导入random.gradle.kts到我的?
和插件依赖于 Kotlin 的功能,embedded-kotlin这些功能的工作方式可能与所请求的版本不同kotlin-dsl1.4.311.5.21
如何设置embedded-kotlin到kotlin-dsl1.5.21版本?
看起来使用插件 DSL 声明一些Kotlin 插件有两种方法:使用id()方法和kotlin()方法。例如,可以使用 或 添加 androidid("kotlin-android")插件kotlin("android")。对于 也是如此,kapt但对于 则不然parcelize。为什么不能这样呢kotlin("parcelize")?这种差异有原因吗?我尝试查找相关文档,但这并没有让我走得太远。
在 Kotlin 中使用 @DslMarker 对注解类进行注解时,装订线中会出现一个图标,指示 DSL 样式
当我尝试将样式更改为不同的颜色时,它没有任何作用。Kotlin 如何选择 DSL 风格,以及如何强制执行特定风格?
我正在尝试使用 ShadowJar 构建一个 fatjar。我的应用程序和 gradle 代码如下。我使用 Gradle 5.0 进行构建。当我运行 ./gradlew run 时,代码有效。当我运行“gradle Shadowjar”,并在“build/lib”文件夹中使用“java -jar”运行 fatjar 时,出现以下错误。
我猜依赖项没有加载到 fatjar 中?我还使用 Groovy 构建 Gradle 文件,但遇到了同样的错误。
我没有在 fatjar 文件中包含所有依赖项,这是否正确?如果是这种情况,您知道如何修改 Gradle 文件以确保包含此文件吗?
Gradle Kotlin DSL
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
// Apply the Kotlin JVM plugin to add support for Kotlin on the JVM.
id("org.jetbrains.kotlin.jvm").version("1.3.21")
id("com.github.johnrengelman.shadow") version "5.0.0"
// Apply the application plugin to add support for building a CLI application.
application
}
repositories {
// Use jcenter for resolving your dependencies.
// …Run Code Online (Sandbox Code Playgroud) 我该如何重新表述:
testCompile.extendsFrom compileOnly
Run Code Online (Sandbox Code Playgroud)
Gradle Groovy DSL 与其基于 Kotlin 的等效项?
configurations {
testCompile{
extendsFrom(compileOnly)
}
}
Run Code Online (Sandbox Code Playgroud)
我上面的方法失败了。
Spring Security 提供了 Kotlin DSL 以便于配置。这是Spring 博客中的一个示例:
override fun configure(http: HttpSecurity?) {
http {
httpBasic {}
authorizeRequests {
authorize("/greetings/**", hasAuthority("ROLE_ADMIN"))
authorize("/**", permitAll)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我只想允许对特定路径的 POST 请求。在Java中,你可以这样做:
http
.httpBasic().and()
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/greetings").hasRole("ADMIN");
Run Code Online (Sandbox Code Playgroud)
有使用 Kotlin DSL 的示例吗?
kotlin-dsl ×11
kotlin ×7
gradle ×6
android ×4
build ×1
build.gradle ×1
gradle-kts ×1
http4k ×1
maven ×1
spring ×1
variables ×1