Kotlin / dokka

API documentation engine for Kotlin
https://kotl.in/dokka
Apache License 2.0
3.34k stars 395 forks source link

Nested multimodule tasks are broken in Gradle 8 #2954

Open dellisd opened 1 year ago

dellisd commented 1 year ago

Describe the bug If you have a root gradle project that you run a multimodule dokka task on (e.g. dokkaHtmlMultiModule) which includes a gradle project that itself has a multimodule setup (i.e. also has a dokkaHtmlMultiModule task), the root dokkaHtmlMultiModule task will fail with an implicit dependency error.

A problem was found with the configuration of task ':dokkaHtmlMultiModule' (type 'DokkaMultiModuleTask').
  - Gradle detected a problem with the following location: '/Users/derekellis/projects/sqldelight/sqldelight-compiler/dialect/build/dokka/htmlPartial'.

    Reason: Task ':dokkaHtmlMultiModule' uses this output of task ':sqldelight-compiler:dokkaHtmlMultiModule' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.

    Possible solutions:
      1. Declare task ':sqldelight-compiler:dokkaHtmlMultiModule' as an input of ':dokkaHtmlMultiModule'.
      2. Declare an explicit dependency on ':sqldelight-compiler:dokkaHtmlMultiModule' from ':dokkaHtmlMultiModule' using Task#dependsOn.
      3. Declare an explicit dependency on ':sqldelight-compiler:dokkaHtmlMultiModule' from ':dokkaHtmlMultiModule' using Task#mustRunAfter.

    Please refer to https://docs.gradle.org/8.0.2/userguide/validation_problems.html#implicit_dependency for more details about this problem.

Note: this only happens on clean builds. If the task(s) are using a cached result of a successful run of the tasks, this error won't be thrown.

Expected behaviour It should build normally.

To Reproduce

  1. Set up a multimodule gradle project with Gradle 8+
  2. Add a multimodule gradle subproject to the root project
  3. Try to run the root multimodule task

Installation

aSemy commented 1 year ago

Related to

I've re-written the Dokka Gradle Plugin to be more compatible with the Gradle API if you'd like to try it:

https://github.com/adamko-dev/dokkatoo

The plan is to merge this plugin upstream, eventually #2839

CLOVIS-AI commented 1 year ago

Same error for me, reproducible in GitLab CI: job | code.

Reproduced with Gradle 8.0.2, Dokka 1.7.20 and 1.8.10.

hfhbd commented 1 year ago

Is there any workaround available beside using dokkatoo?

jeffdgr8 commented 1 year ago

@hfhbd you might try this workaround. Have you read this related issue and thread?

hfhbd commented 1 year ago

Yes, but I don't use native targets, only multiple nested JVM modules and I just switched to dokkatoo.

CLOVIS-AI commented 1 year ago

After migrating to Gradle 8.1.1 and Dokka 1.8.20, without using any of the mentioned workarounds, I do not have this problem anymore.

CLOVIS-AI commented 1 year ago

Nevermind, it seems to depend on the project. I have another project using Gradle 8.1.1 and Dokka 1.8.20, in which the workaround is still necessary.

aajtodd commented 11 months ago

Seeing this in AWS SDK for Kotlin when trying to upgrade to Gradle 8.2.1 and Dokka 1.8.20.

vmishenev commented 10 months ago

I have experienced the same issue when I call Dokka like ./gradlew dokkaHtmlMultiModule. It runs all dokkaHtmlMultiModule tasks in subprojects, that have children. See Gradle: executing tasks by name . So it causes an output of the dokkaHtmlPartial task to be used by two different the dokkaHtmlMultiModule tasks without declaring dependency between them.

Workaround Run ./gradlew :dokkaHtmlMultiModule (with a colon) instead of ./gradlew dokkaHtmlMultiModule. It will run the :dokkaHtmlMultiModule task of the only root project. See Gradle: executing tasks by fully qualified name.

Also, there is a possible workaround to disable other unnecessary dokkaHtmlMultiModule tasks or declare an explicit dependency on them.