Skip to content

Commit 4947743

Browse files
authored
Updated automatic all-modules-page-plugin (#159)
- improved 'missing all-modules-page-plugin' warning message - added option to disable 'missing all-modules-page-plugin' warning - all-modules-page-plugin now provided as a transitive dependency - exclude non-plugin dependencies from generator Dokka Plugins classpath (by checking for Dokka Plugin marker file) - updated some Configurations to be registered lazily - tidy up default Dokka dependencies (remove non-plugins from plugins classpath)
1 parent b43d896 commit 4947743

22 files changed

+321
-132
lines changed

modules/dokkatoo-plugin-integration-tests/src/testIntegration/kotlin/AndroidProjectIntegrationTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ class AndroidProjectIntegrationTest : FunSpec({
6363
)
6464
}
6565
}
66+
67+
test("expect configurations are not resolved during configuration time") {
68+
output shouldNotContain Regex("""Configuration '.*' was resolved during configuration time""")
69+
output shouldNotContain "https://github.com/gradle/gradle/issues/2298"
70+
}
6671
}
6772
}
6873

modules/dokkatoo-plugin/src/main/kotlin/DokkatooBasePlugin.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,10 +325,12 @@ constructor(
325325
const val TASK_GROUP = "dokkatoo"
326326

327327
/** The names of [Gradle tasks][org.gradle.api.Task] created by Dokkatoo */
328-
val taskNames = TaskNames(null)
328+
val taskNames = TaskNames("")
329329

330330
/** The names of [Configuration]s created by Dokkatoo */
331-
val dependencyContainerNames = DependencyContainerNames(null)
331+
@Deprecated("no longer used")
332+
@Suppress("unused")
333+
val dependencyContainerNames = DependencyContainerNames("null")
332334

333335
/** Name of the [Configuration] used to declare dependencies on other subprojects. */
334336
const val DOKKATOO_CONFIGURATION_NAME = "dokkatoo"

modules/dokkatoo-plugin/src/main/kotlin/DokkatooExtension.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ constructor(
5353
* This is primarily used by Kotlin Multiplatform projects, which can have multiple source sets
5454
* per subproject.
5555
*
56-
* Defaults to [the path of the subproject][org.gradle.api.Project.getPath].
56+
* Defaults to [the Gradle path of the subproject][org.gradle.api.Project.getPath].
5757
*/
5858
abstract val sourceSetScopeDefault: Property<String>
5959

modules/dokkatoo-plugin/src/main/kotlin/dependencies/DependencyContainerNames.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import org.gradle.api.artifacts.Configuration
1414
* - [DokkaConfiguration][org.jetbrains.dokka.DokkaConfiguration] - parameters for executing the Dokka Generator
1515
*/
1616
@DokkatooInternalApi
17-
class DependencyContainerNames(override val formatName: String?) : HasFormatName() {
17+
class DependencyContainerNames(override val formatName: String) : HasFormatName() {
1818

1919
val dokkatoo = DOKKATOO_CONFIGURATION_NAME.appendFormat()
2020
val dokkatooResolver = "${dokkatoo}Resolver"
@@ -24,7 +24,7 @@ class DependencyContainerNames(override val formatName: String?) : HasFormatName
2424
*
2525
* Includes transitive dependencies, so this can be passed to the Dokka Generator Worker classpath.
2626
*
27-
* Will be used in user's build scripts to declare additional Dokka Plugins.
27+
* Will be used in user's build scripts to declare additional format-specific Dokka Plugins.
2828
*/
2929
val pluginsClasspath = "dokkatooPlugin".appendFormat()
3030

@@ -51,4 +51,10 @@ class DependencyContainerNames(override val formatName: String?) : HasFormatName
5151

5252
/** Resolver for [generatorClasspath] - internal Dokkatoo usage only. */
5353
val generatorClasspathResolver = "${dokkatoo}GeneratorClasspathResolver"
54+
55+
val publicationPluginClasspath = "${dokkatoo}PublicationPluginClasspath"
56+
val publicationPluginClasspathApiOnly = "${publicationPluginClasspath}ApiOnly"
57+
val publicationPluginClasspathResolver = "${publicationPluginClasspath}Resolver"
58+
val publicationPluginClasspathApiOnlyConsumable =
59+
"${publicationPluginClasspathApiOnly}Consumable"
5460
}

modules/dokkatoo-plugin/src/main/kotlin/dependencies/FormatDependenciesManager.kt

Lines changed: 63 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package dev.adamko.dokkatoo.dependencies
33
import dev.adamko.dokkatoo.dependencies.DokkatooAttribute.Companion.DokkatooClasspathAttribute
44
import dev.adamko.dokkatoo.dependencies.DokkatooAttribute.Companion.DokkatooFormatAttribute
55
import dev.adamko.dokkatoo.internal.DokkatooInternalApi
6+
import dev.adamko.dokkatoo.internal.consumable
67
import dev.adamko.dokkatoo.internal.declarable
78
import dev.adamko.dokkatoo.internal.resolvable
89
import org.gradle.api.NamedDomainObjectProvider
@@ -79,7 +80,7 @@ class FormatDependenciesManager(
7980
*
8081
* Should not contain runtime dependencies - use [dokkaGeneratorClasspath].
8182
*/
82-
val dokkaPluginsClasspath: NamedDomainObjectProvider<Configuration> =
83+
private val dokkaPluginsClasspath: NamedDomainObjectProvider<Configuration> =
8384
project.configurations.register(configurationNames.pluginsClasspath) {
8485
description = "Dokka Plugins classpath for $formatName."
8586
declarable()
@@ -90,8 +91,8 @@ class FormatDependenciesManager(
9091
*
9192
* It extends [dokkaPluginsClasspath].
9293
*/
93-
val dokkaPluginsIntransitiveClasspathResolver: Configuration =
94-
project.configurations.create(configurationNames.pluginsClasspathIntransitiveResolver) {
94+
val dokkaPluginsIntransitiveClasspathResolver: NamedDomainObjectProvider<Configuration> =
95+
project.configurations.register(configurationNames.pluginsClasspathIntransitiveResolver) {
9596
description =
9697
"Resolves Dokka Plugins classpath for $formatName - for internal use. Fetch only the plugins (no transitive dependencies) for use in the Dokka JSON Configuration."
9798
resolvable()
@@ -105,6 +106,51 @@ class FormatDependenciesManager(
105106
}
106107
//endregion
107108

109+
//region Dokka Plugins for Publication Generation
110+
private val dokkaPublicationPluginClasspath: NamedDomainObjectProvider<Configuration> =
111+
project.configurations.register(configurationNames.publicationPluginClasspath) {
112+
description =
113+
"Dokka Plugins classpath for a $formatName Publication (consisting of 1+ Dokka Module)."
114+
declarable()
115+
extendsFrom(baseDependencyManager.declaredDependencies)
116+
}
117+
118+
val dokkaPublicationPluginClasspathResolver: NamedDomainObjectProvider<Configuration> =
119+
project.configurations.register(configurationNames.publicationPluginClasspathResolver) {
120+
description =
121+
"Resolves Dokka Plugins classpath for a $formatName Publication (consisting of 1+ Dokka Module)."
122+
resolvable()
123+
extendsFrom(dokkaPublicationPluginClasspath.get())
124+
attributes {
125+
jvmJar()
126+
attribute(DokkatooFormatAttribute, formatAttributes.format)
127+
attribute(DokkatooClasspathAttribute, baseAttributes.dokkaPublicationPlugins)
128+
}
129+
}
130+
131+
val dokkaPublicationPluginClasspathApiOnly: NamedDomainObjectProvider<Configuration> =
132+
project.configurations.register(configurationNames.publicationPluginClasspathApiOnly) {
133+
description =
134+
"Dokka Plugins for consumers that will assemble a $formatName Publication using the Dokka Module that this project produces"
135+
description = "TODO"
136+
declarable()
137+
}
138+
139+
init {
140+
project.configurations.register(configurationNames.publicationPluginClasspathApiOnlyConsumable) {
141+
description =
142+
"Shared Dokka Plugins for consumers that will assemble a $formatName Publication using the Dokka Module that this project produces"
143+
consumable()
144+
extendsFrom(dokkaPublicationPluginClasspathApiOnly.get())
145+
attributes {
146+
jvmJar()
147+
attribute(DokkatooFormatAttribute, formatAttributes.format)
148+
attribute(DokkatooClasspathAttribute, baseAttributes.dokkaPublicationPlugins)
149+
}
150+
}
151+
}
152+
//endregion
153+
108154
//region Dokka Generator Classpath
109155
/**
110156
* Runtime classpath used to execute Dokka Worker.
@@ -136,8 +182,8 @@ class FormatDependenciesManager(
136182
* @see dev.adamko.dokkatoo.workers.DokkaGeneratorWorker
137183
* @see dev.adamko.dokkatoo.tasks.DokkatooGenerateTask
138184
*/
139-
val dokkaGeneratorClasspathResolver: Configuration =
140-
project.configurations.create(configurationNames.generatorClasspathResolver) {
185+
val dokkaGeneratorClasspathResolver: NamedDomainObjectProvider<Configuration> =
186+
project.configurations.register(configurationNames.generatorClasspathResolver) {
141187
description =
142188
"Dokka Generator runtime classpath for $formatName - will be used in Dokka Worker. Should contain all transitive dependencies, plugins (and their transitive dependencies), so Dokka Worker can run."
143189
resolvable()
@@ -153,18 +199,6 @@ class FormatDependenciesManager(
153199
}
154200
//endregion
155201

156-
private fun componentDependencies(
157-
component: DokkatooAttribute.ModuleComponent
158-
): ModuleComponentDependencies =
159-
ModuleComponentDependencies(
160-
project = project,
161-
component = component,
162-
baseAttributes = baseAttributes,
163-
formatAttributes = formatAttributes,
164-
declaredDependencies = baseDependencyManager.declaredDependencies,
165-
baseConfigurationName = configurationNames.dokkatoo,
166-
)
167-
168202
/**
169203
* Output directories of a Dokka Module.
170204
*
@@ -179,4 +213,16 @@ class FormatDependenciesManager(
179213
*/
180214
val moduleOutputDirectories: ModuleComponentDependencies =
181215
componentDependencies(formatAttributes.moduleOutputDirectories)
216+
217+
private fun componentDependencies(
218+
component: DokkatooAttribute.ModuleComponent,
219+
): ModuleComponentDependencies =
220+
ModuleComponentDependencies(
221+
project = project,
222+
component = component,
223+
baseAttributes = baseAttributes,
224+
formatAttributes = formatAttributes,
225+
declaredDependencies = baseDependencyManager.declaredDependencies,
226+
baseConfigurationName = configurationNames.dokkatoo,
227+
)
182228
}

modules/dokkatoo-plugin/src/main/kotlin/dependencies/ModuleComponentDependencies.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import dev.adamko.dokkatoo.dependencies.DokkatooAttribute.Companion.DokkatooForm
44
import dev.adamko.dokkatoo.dependencies.DokkatooAttribute.Companion.DokkatooModuleComponentAttribute
55
import dev.adamko.dokkatoo.internal.*
66
import java.io.File
7+
import org.gradle.api.NamedDomainObjectProvider
78
import org.gradle.api.Project
89
import org.gradle.api.artifacts.Configuration
910
import org.gradle.api.artifacts.result.ResolvedArtifactResult
@@ -25,8 +26,8 @@ class ModuleComponentDependencies(
2526
private val formatName: String get() = formatAttributes.format.name
2627
private val componentName: String get() = component.name
2728

28-
private val resolver: Configuration =
29-
project.configurations.create("${baseConfigurationName}${componentName}Resolver") {
29+
private val resolver: NamedDomainObjectProvider<Configuration> =
30+
project.configurations.register("${baseConfigurationName}${componentName}Resolver") {
3031
description = "Resolves Dokkatoo $formatName $componentName files."
3132
resolvable()
3233
extendsFrom(declaredDependencies)
@@ -37,11 +38,12 @@ class ModuleComponentDependencies(
3738
}
3839
}
3940

40-
val outgoing: Configuration =
41-
project.configurations.create("${baseConfigurationName}${componentName}Consumable") {
41+
val outgoing: NamedDomainObjectProvider<Configuration> =
42+
project.configurations.register("${baseConfigurationName}${componentName}Consumable") {
4243
description =
4344
"Provides Dokkatoo $formatName $componentName files for consumption by other subprojects."
4445
consumable()
46+
extendsFrom(declaredDependencies)
4547
attributes {
4648
attribute(USAGE_ATTRIBUTE, baseAttributes.dokkatooUsage)
4749
attribute(DokkatooFormatAttribute, formatAttributes.format)
@@ -62,13 +64,14 @@ class ModuleComponentDependencies(
6264
* enabled, which might obscure errors.
6365
*/
6466
val incomingArtifactFiles: Provider<List<File>> =
65-
resolver.incomingArtifacts().map { it.map(ResolvedArtifactResult::getFile) }
67+
resolver.get().incomingArtifacts().map { it.map(ResolvedArtifactResult::getFile) }
6668

6769
private fun Configuration.incomingArtifacts(): Provider<List<ResolvedArtifactResult>> {
6870

6971
// Redefine variables locally, because Configuration Cache is easily confused
7072
// and produces confusing error messages.
7173
val baseAttributes = baseAttributes
74+
val usage = baseAttributes.dokkatooUsage
7275
val formatAttributes = formatAttributes
7376
val incoming = incoming
7477
val incomingName = incoming.name
@@ -79,7 +82,7 @@ class ModuleComponentDependencies(
7982
@Suppress("UnstableApiUsage")
8083
withVariantReselection()
8184
attributes {
82-
attribute(USAGE_ATTRIBUTE, baseAttributes.dokkatooUsage)
85+
attribute(USAGE_ATTRIBUTE, usage)
8386
attribute(DokkatooFormatAttribute, formatAttributes.format)
8487
attribute(DokkatooModuleComponentAttribute, component)
8588
}

modules/dokkatoo-plugin/src/main/kotlin/dependencies/attributeValues.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import org.gradle.api.artifacts.Configuration
66
import org.gradle.api.attributes.Attribute
77
import org.gradle.api.attributes.Usage
88
import org.gradle.api.model.ObjectFactory
9-
import org.gradle.api.provider.Provider
109
import org.gradle.kotlin.dsl.*
1110

1211

@@ -17,6 +16,8 @@ class BaseAttributes(
1716
) {
1817
val dokkatooUsage: Usage = objects.named("dev.adamko.dokkatoo")
1918
val dokkaPlugins: DokkatooAttribute.Classpath = objects.named("dokka-plugins")
19+
val dokkaPublicationPlugins: DokkatooAttribute.Classpath =
20+
objects.named("dokka-publication-plugins")
2021
val dokkaGenerator: DokkatooAttribute.Classpath = objects.named("dokka-generator")
2122
}
2223

@@ -28,5 +29,7 @@ class FormatAttributes(
2829
objects: ObjectFactory,
2930
) {
3031
val format: DokkatooAttribute.Format = objects.named(formatName)
31-
val moduleOutputDirectories: DokkatooAttribute.ModuleComponent = objects.named("ModuleOutputDirectories")
32+
33+
val moduleOutputDirectories: DokkatooAttribute.ModuleComponent =
34+
objects.named("ModuleOutputDirectories")
3235
}

modules/dokkatoo-plugin/src/main/kotlin/dokka/parameters/builders/DokkaParametersBuilder.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ import dev.adamko.dokkatoo.DokkatooBasePlugin
44
import dev.adamko.dokkatoo.dokka.parameters.DokkaGeneratorParametersSpec
55
import dev.adamko.dokkatoo.dokka.parameters.DokkaModuleDescriptionKxs
66
import dev.adamko.dokkatoo.dokka.plugins.DokkaPluginParametersBaseSpec
7+
import dev.adamko.dokkatoo.formats.DokkatooHtmlPlugin.Companion.extractDokkaPluginMarkers
78
import dev.adamko.dokkatoo.internal.DokkatooInternalApi
89
import java.io.File
910
import org.gradle.api.Project
11+
import org.gradle.api.file.ArchiveOperations
12+
import org.gradle.api.file.FileCollection
1013
import org.gradle.api.logging.Logger
1114
import org.gradle.api.logging.Logging
1215
import org.jetbrains.dokka.*
@@ -19,7 +22,9 @@ import org.jetbrains.dokka.*
1922
* leaking into the public API.
2023
*/
2124
@DokkatooInternalApi
22-
internal object DokkaParametersBuilder {
25+
internal class DokkaParametersBuilder(
26+
private val archives: ArchiveOperations,
27+
) {
2328

2429
private val logger: Logger = Logging.getLogger(DokkaParametersBuilder::class.java)
2530

@@ -40,7 +45,10 @@ internal object DokkaParametersBuilder {
4045
val finalizeCoroutines = spec.finalizeCoroutines.get()
4146
val pluginsConfiguration = spec.pluginsConfiguration.toSet()
4247

43-
val pluginsClasspath = spec.pluginsClasspath.files.toList()
48+
val pluginsClasspath = buildPluginsClasspath(
49+
plugins = spec.pluginsClasspath,
50+
)
51+
4452
val includes = spec.includes.files
4553

4654
return DokkaConfigurationImpl(
@@ -62,6 +70,18 @@ internal object DokkaParametersBuilder {
6270
)
6371
}
6472

73+
private fun buildPluginsClasspath(
74+
plugins: FileCollection,
75+
): List<File> {
76+
// only include dependencies with Dokka Plugin markers
77+
return plugins
78+
.filter { file ->
79+
val pluginIds = extractDokkaPluginMarkers(archives, file)
80+
pluginIds.isNotEmpty()
81+
}
82+
.toList()
83+
}
84+
6585
private fun buildModuleDescriptors(
6686
moduleDescriptorDirs: Iterable<File>
6787
): List<DokkaModuleDescriptionImpl> {

0 commit comments

Comments
 (0)