diff --git a/README.md b/README.md index 6fb752a..be9d4ed 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,11 @@ public class LibraryArchRules implements ArchRulesService { When authoring rules about the usage of your own library code, it is recommended to colocate your rules library in the same project as the library code. The ArchRules plugin will publish the rules in a separate Jar, and the Runner plugin -will select that jar for running rules, but these rule classes will not end up up in the runtime classpath. +will select that jar for running rules, but these rule classes will not end up in the runtime classpath. + +#### How it works + +The Archrules Library plugin produces a separate Jar for the `archRules` sourceset, which is exposed as an alternate variant of the library. ## LICENSE diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt index d58244e..f89edbe 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt @@ -2,9 +2,11 @@ package com.netflix.nebula.archrules.gradle import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.attributes.Usage import org.gradle.api.plugins.JavaPluginExtension import org.gradle.jvm.tasks.Jar import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.register class ArchrulesLibraryPlugin : Plugin { @@ -13,13 +15,21 @@ class ArchrulesLibraryPlugin : Plugin { val ext = project.extensions.getByType() val archRulesSourceSet = ext.sourceSets.create("archRules") val version = ArchrulesLibraryPlugin::class.java.`package`.implementationVersion ?: "latest.release" - project.dependencies.add(archRulesSourceSet.implementationConfigurationName, + project.dependencies.add( + archRulesSourceSet.implementationConfigurationName, "com.netflix.nebula:nebula-archrules-core:$version" ) val jarTask = project.tasks.register("archRulesJar") { archiveClassifier.set("archrules") from(archRulesSourceSet.output) } + val runtimeElements = project.configurations.getByName("runtimeElements") + runtimeElements.outgoing.variants.create("archRulesElements") { + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named("arch-rules")) + } + artifact(jarTask) + } } } } \ No newline at end of file diff --git a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt index 6c0497a..1dd88ad 100644 --- a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt +++ b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt @@ -83,13 +83,19 @@ class ArchrulesLibraryPluginTest { assertThat(moduleMetadata) .`as`("Gradle Module Metadata is created") .exists() + val moduleMetadataJson = moduleMetadata.readText() - println(moduleMetadataJson) + assertThatJson(moduleMetadataJson) .inPath("$.variants[?(@.name=='runtimeElements')].files[0]") .isArray .first().isObject .containsEntry("name", "library-with-rules-0.0.1.jar") + assertThatJson(moduleMetadataJson) + .inPath("$.variants[?(@.name=='runtimeElementsArchRulesElements')].files[0]") + .isArray + .first().isObject + .containsEntry("name", "library-with-rules-0.0.1-archrules.jar") } } \ No newline at end of file diff --git a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/IntegrationTest.kt b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/IntegrationTest.kt index 11e094a..150836e 100644 --- a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/IntegrationTest.kt +++ b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/IntegrationTest.kt @@ -49,6 +49,7 @@ internal class IntegrationTest { val result = runner.run("check") { withGradleVersion(gradleVersion.version) + forwardOutput() } assertThat(result.task(":library-with-rules:check"))