Gradle 5.0 вызывает ошибку Val не может быть переназначен при использовании Kotlin DSL в buid.gradle.kts - PullRequest
0 голосов
/ 28 ноября 2018

Эта ошибка НЕ возникла в версии Gradle 4.10.2

Строка classDirectories = files(filesToCover) заставляет Gradle выдать ошибку:

* What went wrong:
Script compilation error:

  Line 80:             classDirectories = files(filesToCover)
                       ^ Val cannot be reassigned

Но когда выпосмотрите на базовый класс Java JacocoReportBase, вы можете ясно увидеть, что есть установщик и свойство класса не является окончательным.

public abstract class JacocoReportBase extends JacocoBase {
    private FileCollection executionData;
    private FileCollection sourceDirectories;
    private FileCollection classDirectories;
    private FileCollection additionalClassDirs;
    private FileCollection additionalSourceDirs;

    ...

    public void setClassDirectories(FileCollection classDirectories) {
        this.classDirectories = classDirectories;
    }

build.gradle.kts

tasks {
    withType<KotlinCompile<KotlinJvmOptions>> {
        kotlinOptions.freeCompilerArgs = listOf("-Xjsr305=strict")
        kotlinOptions.jvmTarget = "1.8"
    }

    withType<JacocoReport> {
        reports {
            xml.isEnabled = false
            csv.isEnabled = false
            html.destination = file("$buildDir/jacocoHtml")
        }

        afterEvaluate {
            val filesToAvoidForCoverage = listOf(
                    "/dto",
                    "/config",
                    "AuthenticationMicroServiceKt.class"
            )
            val filesToCover = mutableListOf<String>()
            File("build/classes/kotlin/main/app/example/core/")
                    .walkTopDown()
                    .mapNotNull { file ->
                        var match = false
                        filesToAvoidForCoverage.forEach {
                            if (file.absolutePath.contains(it)) {
                                match = true
                            }
                        }
                        return@mapNotNull if (!match) {
                            file.absolutePath
                        } else {
                            null
                        }
                    }
                    .filter { it.contains(".class") }
                    .toCollection(filesToCover)

            classDirectories = files(filesToCover) // error
        }
    }
}

Я также опубликовал проблему в Github здесь

1 Ответ

0 голосов
/ 01 декабря 2018

Давайте рассмотрим исходный код :

/**
 * Source sets that coverage should be reported for.
 */
@PathSensitive(PathSensitivity.RELATIVE)
@InputFiles
public ConfigurableFileCollection getClassDirectories() {
    return classDirectories;
}

/**
 * Classes that coverage should be reported for.
 * @deprecated Use {@code getClassDirectories().setFrom(...)}
 */
@Deprecated
public void setClassDirectories(FileCollection classDirectories) {
    DeprecationLogger.nagUserOfDiscontinuedMethod("JacocoReportBase.setClassDirectories(FileCollection)", "Use getClassDirectories().from(...)");
    this.classDirectories.setFrom(classDirectories);
}

Как видите, getClassDirectories имеет тип возврата ConfigurableFileCollection и setClassDirectories принимает FileCollection.Так что это недопустимое свойство Java Beans, потому что getter и setter работают с разными типами.Таким образом, Котлин видит только добытчик, и это, на самом деле, val.

Вы можете либо попытаться вызвать setClassDirectories напрямую (setClassDirectories(…) вместо classDirectories = …), либо использовать classDirectories.setFrom, как предложено Javadocs.

Это работало в 4.10.2, потому что это было свойством в то время (типы получателя и установщика были одинаковыми).Все изменилось в этом коммите .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...