我想build.gradle使用Gradle Script Kotlin将我的Android项目中的文件从Groovy 转换为Kotlin.我喜欢Kotlin中的所有这些,但如果有一些限制,那么尽可能多.
让我们假设我只有一个空项目,刚从Android Studio"新应用程序"模板创建(minSdkVersion 15如果重要的话,使用AppCompat).我需要采取哪些步骤才能将此项目转换为Gradle Script Kotlin.
我希望这应该是我(以及其他所有人)的一个很好的起点,我可以处理我自己转换任何自定义逻辑.
android gradle kotlin android-gradle-plugin gradle-kotlin-dsl
使用gradle-groovy,可以使用以下命令创建新配置:
configurations {
explode
}
dependencies {
explode (group: 'org.apache.samza', name: 'samza-shell', ext: 'tgz', classifier: 'dist', version: "$SAMZA_VERSION")
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何用kotlin-dsl做到这一点。我试过了:
val explode by configurations
dependencies {
explode(group = "org.apache.samza", name = "samza-shell", ext = "tgz", classifier = "dist", version = samzaVersion)
// "explode"(group = "org.apache.samza", name = "samza-shell", ext = "tgz", classifier = "dist", version = samzaVersion)
}
Run Code Online (Sandbox Code Playgroud)
但没有成功。有任何想法吗?
我想要什么?
我想使用kotlintest运行测试,并且单击了测试类旁边的图标,从而成功地从IntelliJ运行了它们。我的项目中也有JUnit 5测试。我现在开始使用Gradle Kotlin DSL,并且设法运行了check执行JUnit 5任务的Gradle 任务。
问题是什么?
kotlintest测试未运行!似乎它没有被Gradle发现,因为失败的测试使Gradle任务成功。所以,
如何同时使用Gradle Kotlin DSL和JUnit 5运行kotlintest测试?
我尝试了什么?
如何使用Gradle运行kotlintest测试?基本上是问题的旧版本,但是由于使用了不同的技术:JUnit 4和Gradle而不是Gradle Kotlin DSL,已经过时了。我可以找到的所有其他问题是针对JUnit 4还是不带kotlintest的JUnit 5。
项目设置
我正在使用Gradle 4.6。我的测试是
import io.kotlintest.matchers.exactly
import io.kotlintest.matchers.shouldBe
import io.kotlintest.specs.FunSpec
class KotlinTest: FunSpec() {
init {
testCalculate()
}
/** This failing test will not fail the Gradle check. */
fun testCalculate() = test("one plus one is two") {
(1+1).toDouble() shouldBe exactly(42.0)
}
}
Run Code Online (Sandbox Code Playgroud)
我的build.gradle.kts是
import org.gradle.api.plugins.ExtensionAware
import org.junit.platform.gradle.plugin.FiltersExtension …Run Code Online (Sandbox Code Playgroud) 现在我用这种方式:
plugins {
val kotlinVersion: String by project
val springBootPluginVersion: String by project
val springDependencyManagementPluginVersion: String by project
id("org.jetbrains.kotlin.plugin.allopen") version kotlinVersion
id("org.jetbrains.kotlin.jvm") version kotlinVersion
id("org.springframework.boot") version springBootPluginVersion
id("io.spring.dependency-management") version springDependencyManagementPluginVersion
}
Run Code Online (Sandbox Code Playgroud)
这个变种编译和工作,但我不知道这是正确的,为什么IntelliJ IDEA在放置版本定义的行上显示错误:
'val Build_gradle.project: Project' can't be called in this context by implicit receiver. Use the explicit one if necessary
Run Code Online (Sandbox Code Playgroud) 我真的很想特别喜欢Gradle 5和新的Kotlin DSL的结合,但是我很难(很容易)获得一个非常,非常简单且通用的Gradle运行版本。
在Maven默认目录布局中以简单的Gradle构建(即DRY)的形式发布具有几个相互依赖的子模块的Java库,作为高质量的Maven工件/存储库。
因此:有一个根项目作为伞,该根项目定义并包含所有通用配置(实际上是所有依赖项除外)。
我将当前的“结果”移植到Github上的示例项目中,并且已经在Gradle论坛中提出了这个问题。
目前,我无法声明在中央构建中提供标准-sources和-javadoc工件的必要任务。
例如,在寻找基于Kotlin DSL的解决方案时会发现这三个“解决方案” 在多模块场景中都不起作用(更长):
/build.gradle.kts)完整示例参见Github:https : //github.com/bentolor/gradle-maven-multimodule-kotlindsl
subprojects {
apply(plugin = "java-library")
apply(plugin = "maven-publish")
group = "de.bentolor.sampleproject"
version = "0.1.0"
repositories {
jcenter()
}
dependencies {
// Dependencies used in EVERY module
"compile"("commons-logging:commons-logging:1.2")
"testImplementation"("junit:junit:4.12")
}
tasks { …Run Code Online (Sandbox Code Playgroud) 在Gradle(5.0+)中有两种创建方法,即任务:
tasks {
val javadocJar by creating(Jar::class) {
val javadoc by tasks
from(javadoc)
classifier = "javadoc"
}
}
Run Code Online (Sandbox Code Playgroud)
和
tasks {
val javadocJar by registering(Jar::class) {
val javadoc by tasks
from(javadoc)
classifier = "javadoc"
}
}
Run Code Online (Sandbox Code Playgroud)
基本上是相同的API,有什么区别?
请帮助我了解 Gradle 6 中的更改,因此以下代码不再起作用(在 Gradle 5 中运行良好):
val artifactoryUser: String by settings
val artifactoryPassword: String by settings
pluginManagement {
repositories {
mavenLocal()
maven {
url = uri("https://internal-artifactory")
credentials {
username = artifactoryUser
password = artifactoryPassword
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个错误:“未解决的引用:artifactoryUser”。
这个问题可以通过在 pluginManagement 块中移动属性声明来解决
pluginManagement {
val artifactoryUser: String by settings
val artifactoryPassword: String by settings
repositories {
mavenLocal()
maven {
url = uri("https://internal-artifactory")
credentials {
username = artifactoryUser
password = artifactoryPassword
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么。
有一个使用 Kotlin DSL 的 Gradle 6.X 多模块项目。
buildSrc功能用于在中心位置管理依赖版本。类似于此处描述的方法。
该项目使用内部服务器下载依赖项。它会导致两个地方的存储库设置配置重复:
buildSrc/build.gradle.kts:
plugins {
`kotlin-dsl`
}
repositories {
// The org.jetbrains.kotlin.jvm plugin requires a repository
// where to download the Kotlin compiler dependencies from.
maven {
url = uri("${extra.properties["custom.url"] as? String}")
credentials() {
username = extra.properties["custom.username"] as? String
password = extra.properties["custom.password"] as? String
}
}
}
Run Code Online (Sandbox Code Playgroud)
和根settings.gradle.kts:
...
gradle.projectsLoaded {
allprojects {
repositories {
maven {
url = uri("${extra.properties["custom.url"] as? String}")
credentials() {
username = extra.properties["custom.username"] …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的 android studio 更新到 4.0(gradle 构建工具 4.0),并将 gradle 从 5.6.4 更新到 6.1.1。但是当我这样做时,我收到了一个专门针对 lint 任务的构建错误。
因此,当我运行./gradlew build或./gradlew lint出现以下错误时。
> Task :mylib:lint FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':mylib:lint'.
> Lint infrastructure error
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.android.tools.lint.gradle.api.ReflectiveLintRunner.runLint(ReflectiveLintRunner.kt:38)
at com.android.build.gradle.tasks.LintBaseTask.runLint(LintBaseTask.java:114)
at com.android.build.gradle.tasks.LintGlobalTask.lint(LintGlobalTask.java:50)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
at …Run Code Online (Sandbox Code Playgroud) android gradle android-studio android-gradle-plugin gradle-kotlin-dsl
我收到此 gradle 同步错误 -应用了 Hilt Android Gradle 插件,但未找到 com.google.dagger:hilt-android 依赖项。有人可以帮忙吗?:)
我使用 kotlin dsl,我在 buildSrc 中有 libs.kt
buildSrc - build.gradle.kts:
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}
Run Code Online (Sandbox Code Playgroud)
buildSrc 中的 libs.kt
object libs {
object hilt {
private const val dagger_hilt_version = "2.30.1-alpha"
private const val jetpack_hilt_version = "1.0.0-alpha02"
const val gradlePlugin = "com.google.dagger:hilt-android-gradle-plugin:$dagger_hilt_version"
const val android = "com.google.dagger:hilt-android:$dagger_hilt_version"
const val android_compiler = "com.google.dagger:hilt-android-compiler:$dagger_hilt_version"
const val jetpack_viewmodel = "androidx.hilt:hilt-lifecycle-viewmodel:$jetpack_hilt_version"
const val jetpack_compiler = "androidx.hilt:hilt-compiler:$jetpack_hilt_version"
}
/* more objects + …Run Code Online (Sandbox Code Playgroud) gradle ×10
kotlin ×4
android ×3
dagger-hilt ×1
java ×1
junit5 ×1
kotlintest ×1
maven ×1
multi-module ×1