Kotlin / kotlin-jupyter

Kotlin kernel for Jupyter/IPython
Apache License 2.0
1.09k stars 106 forks source link

Gradle plugin not compatible with centralized repositories declaration #409

Open aSemy opened 1 year ago

aSemy commented 1 year ago

I would like to use Centralizing repositories declaration in my Gradle project.

To protect against rogue plugins adding random repos, I enable RepositoriesMode.FAIL_ON_PROJECT_REPOS.

However, this causes an error because the Jupyter Gradle plugin manually adds a repository.

https://github.com/Kotlin/kotlin-jupyter/blob/76a1cfa833fedb0982293e62a54d7398b4073572/jupyter-lib/kotlin-jupyter-api-gradle-plugin/src/main/kotlin/org/jetbrains/kotlinx/jupyter/api/plugin/ApiGradlePlugin.kt#L38-L40

This is quite unusual, and I think it should be removed.

I am using Gradle version 8.1

Reproduce

To reproduce, a build.gradle.kts and settings.gradle.kts files are needed.

// settings.gradle.kts

rootProject.name = "my-project"

pluginManagement {
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

@Suppress("UnstableApiUsage")
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)

    repositories {
        mavenCentral()
    }
}
// build.gradle.kts

plugins {
    kotlin("jvm") version "1.8.20"
    kotlin("jupyter.api") version "0.11.0-358"
}

This causes an error:

Build file '/projects/my-project/build.gradle.kts' line: 3

An exception occurred applying plugin request [id: 'org.jetbrains.kotlin.jupyter.api', version: '0.11.0-358']
> Failed to apply plugin 'org.jetbrains.kotlin.jupyter.api'.
   > Build was configured to prefer settings repositories over project repositories but repository 'MavenRepo' was added by plugin 'org.jetbrains.kotlin.jupyter.api'

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Exception is:
org.gradle.api.plugins.InvalidPluginException: An exception occurred applying plugin request [id: 'org.jetbrains.kotlin.jupyter.api', version: '0.11.0-358']
    ...
Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin 'org.jetbrains.kotlin.jupyter.api'.
    ...
Caused by: org.gradle.api.InvalidUserCodeException: Build was configured to prefer settings repositories over project repositories but repository 'MavenRepo' was added by plugin 'org.jetbrains.kotlin.jupyter.api'
    at org.gradle.internal.management.DefaultDependencyResolutionManagement.repoMutationDisallowedOnProject(DefaultDependencyResolutionManagement.java:199)
    at org.gradle.internal.ImmutableActionSet$SetWithFewActions.execute(ImmutableActionSet.java:285)
    at org.gradle.api.internal.DefaultDomainObjectCollection.doAdd(DefaultDomainObjectCollection.java:262)
    at org.gradle.api.internal.DefaultNamedDomainObjectCollection.doAdd(DefaultNamedDomainObjectCollection.java:113)
    at org.gradle.api.internal.DefaultDomainObjectCollection.add(DefaultDomainObjectCollection.java:251)
    at org.gradle.api.internal.artifacts.DefaultArtifactRepositoryContainer.access$101(DefaultArtifactRepositoryContainer.java:35)
    at org.gradle.api.internal.artifacts.DefaultArtifactRepositoryContainer.lambda$new$0(DefaultArtifactRepositoryContainer.java:38)
    at org.gradle.api.internal.artifacts.DefaultArtifactRepositoryContainer.addWithUniqueName(DefaultArtifactRepositoryContainer.java:101)
    at org.gradle.api.internal.artifacts.DefaultArtifactRepositoryContainer.addRepository(DefaultArtifactRepositoryContainer.java:89)
    at org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler.maven(DefaultRepositoryHandler.java:161)
    at org.jetbrains.kotlinx.jupyter.api.plugin.util.DependenciesUtilKt.addMavenIfDoesNotExist(dependenciesUtil.kt:18)
    at org.jetbrains.kotlinx.jupyter.api.plugin.util.DependenciesUtilKt.addMavenCentralIfDoesNotExist(dependenciesUtil.kt:25)
    at org.jetbrains.kotlinx.jupyter.api.plugin.ApiGradlePlugin$apply$1$4.invoke(ApiGradlePlugin.kt:39)
    at org.jetbrains.kotlinx.jupyter.api.plugin.ApiGradlePlugin$apply$1$4.invoke(ApiGradlePlugin.kt:38)
    at org.gradle.kotlin.dsl.ProjectExtensionsKt.repositories(ProjectExtensions.kt:159)
    at org.jetbrains.kotlinx.jupyter.api.plugin.ApiGradlePlugin.apply(ApiGradlePlugin.kt:38)
    at org.jetbrains.kotlinx.jupyter.api.plugin.ApiGradlePlugin.apply(ApiGradlePlugin.kt:19)
    at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:43)
    ...

Workaround

As a workaround I can adjust RepositoriesMode to be less strict.

    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

However this causes a warning message every time I run a Gradle command.

Build was configured to prefer settings repositories over project repositories but repository 'MavenRepo' was added by plugin 'org.jetbrains.kotlin.jupyter.api'
ileasile commented 1 year ago

Thank you, I'll consider adding an option to disable auto-adding of Maven repositories