Search in sources :

Example 1 with VariantVersionMappingStrategy

use of org.gradle.api.publish.VariantVersionMappingStrategy in project gradle by gradle.

the class DefaultVersionMappingStrategy method findStrategyForVariant.

@Override
public VariantVersionMappingStrategyInternal findStrategyForVariant(ImmutableAttributes variantAttributes) {
    DefaultVariantVersionMappingStrategy strategy = createDefaultMappingStrategy(variantAttributes);
    // Apply strategies for "all variants"
    for (Action<? super VariantVersionMappingStrategy> action : mappingsForAllVariants) {
        action.execute(strategy);
    }
    // Then use attribute specific mapping
    if (!attributeBasedMappings.isEmpty()) {
        AttributeMatcher matcher = schema.matcher();
        Set<ImmutableAttributes> candidates = attributeBasedMappings.keySet();
        List<ImmutableAttributes> matches = matcher.matches(candidates, variantAttributes, AttributeMatchingExplanationBuilder.NO_OP);
        if (matches.size() == 1) {
            Collection<Action<? super VariantVersionMappingStrategy>> actions = attributeBasedMappings.get(matches.get(0));
            for (Action<? super VariantVersionMappingStrategy> action : actions) {
                action.execute(strategy);
            }
        } else if (matches.size() > 1) {
            throw new InvalidUserCodeException("Unable to find a suitable version mapping strategy for " + variantAttributes);
        }
    }
    return strategy;
}
Also used : AttributeMatcher(org.gradle.internal.component.model.AttributeMatcher) Action(org.gradle.api.Action) ImmutableAttributes(org.gradle.api.internal.attributes.ImmutableAttributes) InvalidUserCodeException(org.gradle.api.InvalidUserCodeException) VariantVersionMappingStrategy(org.gradle.api.publish.VariantVersionMappingStrategy)

Example 2 with VariantVersionMappingStrategy

use of org.gradle.api.publish.VariantVersionMappingStrategy in project gradle by gradle.

the class DefaultVersionMappingStrategy method findStrategyForVariant.

@Override
public VariantVersionMappingStrategyInternal findStrategyForVariant(ImmutableAttributes variantAttributes) {
    DefaultVariantVersionMappingStrategy strategy = createDefaultMappingStrategy(variantAttributes);
    // Apply strategies for "all variants"
    for (Action<? super VariantVersionMappingStrategy> action : mappingsForAllVariants) {
        action.execute(strategy);
    }
    // Then use attribute specific mapping
    if (!attributeBasedMappings.isEmpty()) {
        AttributeMatcher matcher = schema.matcher();
        Set<ImmutableAttributes> candidates = attributeBasedMappings.keySet();
        List<ImmutableAttributes> matches = matcher.matches(candidates, variantAttributes, AttributeMatchingExplanationBuilder.NO_OP);
        if (matches.size() == 1) {
            Collection<Action<? super VariantVersionMappingStrategy>> actions = attributeBasedMappings.get(matches.get(0));
            for (Action<? super VariantVersionMappingStrategy> action : actions) {
                action.execute(strategy);
            }
        } else if (matches.size() > 1) {
            throw new InvalidUserCodeException("Unable to find a suitable version mapping strategy for " + variantAttributes);
        }
    }
    return strategy;
}
Also used : AttributeMatcher(org.gradle.internal.component.model.AttributeMatcher) Action(org.gradle.api.Action) ImmutableAttributes(org.gradle.api.internal.attributes.ImmutableAttributes) InvalidUserCodeException(org.gradle.api.InvalidUserCodeException) DefaultVariantVersionMappingStrategy(org.gradle.api.publish.internal.versionmapping.DefaultVariantVersionMappingStrategy) DefaultVariantVersionMappingStrategy(org.gradle.api.publish.internal.versionmapping.DefaultVariantVersionMappingStrategy) VariantVersionMappingStrategy(org.gradle.api.publish.VariantVersionMappingStrategy)

Example 3 with VariantVersionMappingStrategy

use of org.gradle.api.publish.VariantVersionMappingStrategy in project curiostack by curioswitch.

the class CuriostackRootPlugin method setupJavaProject.

private static void setupJavaProject(Project project, Map<String, CheckSeverity> errorProneChecks) {
    setupRepositories(project);
    PluginContainer plugins = project.getPlugins();
    plugins.apply(ErrorPronePlugin.class);
    plugins.apply(IdeaPlugin.class);
    plugins.apply(NullAwayPlugin.class);
    plugins.apply(VersionsPlugin.class);
    var java = project.getExtensions().getByType(JavaPluginExtension.class);
    java.withJavadocJar();
    java.withSourcesJar();
    // Manage all dependencies by adding the bom as a platform.
    Object bomDependency = isCuriostack(project) ? project.getDependencies().project(ImmutableMap.of("path", ":tools:curiostack-bom")) : "org.curioswitch.curiostack:curiostack-bom:" + ToolDependencies.getBomVersion(project);
    var platformDependency = project.getDependencies().platform(bomDependency);
    // Needs to be in afterEvaluate since there is no way to guarantee isCanBeResolved, etc
    // are set otherwise.
    project.getConfigurations().configureEach(configuration -> {
        if (configuration instanceof DeprecatableConfiguration) {
            if (((DeprecatableConfiguration) configuration).getDeclarationAlternatives() != null) {
                return;
            }
        }
        if (!configuration.getName().endsWith("Classpath") && !UNMANAGED_CONFIGURATIONS.contains(configuration.getName())) {
            project.getDependencies().add(configuration.getName(), platformDependency);
        }
    });
    project.afterEvaluate(unused -> {
        plugins.withType(MavenPublishPlugin.class, unused2 -> {
            var publishing = project.getExtensions().getByType(PublishingExtension.class);
            publishing.getPublications().configureEach(publication -> {
                if (!(publication instanceof MavenPublication)) {
                    return;
                }
                var mavenPublication = (MavenPublication) publication;
                mavenPublication.versionMapping(mapping -> mapping.allVariants(VariantVersionMappingStrategy::fromResolutionResult));
                mavenPublication.getPom().withXml(xml -> {
                    var root = xml.asNode();
                    findChild(root, "dependencyManagement").ifPresent(root::remove);
                });
            });
        });
    });
    project.getTasks().withType(JavaCompile.class).configureEach(task -> {
        task.getOptions().setIncremental(true);
        ErrorProneOptions errorProne = ((ExtensionAware) task.getOptions()).getExtensions().findByType(ErrorProneOptions.class);
        if (errorProne != null) {
            errorProne.getDisableWarningsInGeneratedCode().set(true);
            errorProne.getIgnoreUnknownCheckNames().set(true);
            errorProne.getExcludedPaths().set("(.*/build/.*|.*/gen-src/.*)");
            errorProne.getChecks().set(errorProneChecks);
            var nullaway = ((ExtensionAware) errorProne).getExtensions().getByType(NullAwayOptions.class);
            nullaway.getSeverity().set(WARN);
            nullaway.getExcludedFieldAnnotations().addAll(MonotonicNonNull.class.getCanonicalName(), "org.mockito.Mock");
        }
    });
    JavaPluginConvention javaPlugin = project.getConvention().getPlugin(JavaPluginConvention.class);
    javaPlugin.setSourceCompatibility(JavaVersion.VERSION_16);
    javaPlugin.setTargetCompatibility(JavaVersion.VERSION_16);
    // Even for libraries that set source version to 8/11 for compatibility with older runtimes,
    // we always use 15 for tests.
    var testSourceSet = javaPlugin.getSourceSets().getByName(SourceSet.TEST_SOURCE_SET_NAME);
    project.getConfigurations().getByName(testSourceSet.getCompileClasspathConfigurationName()).getAttributes().attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 16);
    project.getConfigurations().getByName(testSourceSet.getRuntimeClasspathConfigurationName()).getAttributes().attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 16);
    project.getTasks().withType(Test.class).named("test").configure(test -> {
        if (project.getRootProject().hasProperty("updateSnapshots")) {
            test.jvmArgs(ImmutableList.of("-Dorg.curioswitch.testing.updateSnapshots=true"));
        }
        test.useJUnitPlatform(platform -> platform.includeEngines("junit-jupiter", "junit-vintage"));
        test.testLogging(logging -> {
            logging.setShowStandardStreams(true);
            logging.setExceptionFormat(TestExceptionFormat.FULL);
        });
    });
    // While Gradle attempts to generate a unique module name automatically,
    // it doesn't seem to always work properly, so we just always use unique
    // module names.
    project.getPlugins().withType(IdeaPlugin.class, plugin -> {
        IdeaModule module = plugin.getModel().getModule();
        String moduleName = project.getName();
        Project ancestor = project.getParent();
        while (ancestor != null && ancestor != project.getRootProject()) {
            moduleName = ancestor.getName() + "-" + moduleName;
            ancestor = ancestor.getParent();
        }
        module.setName(moduleName);
        project.getTasks().named("cleanIdea").configure(t -> t.doLast(unused -> project.file(project.getName() + ".iml").delete()));
    });
    // Pretty much all java code needs at least the Generated annotation.
    project.getDependencies().add(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, "jakarta.annotation:jakarta.annotation-api");
    project.getDependencies().add(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME, "org.checkerframework:checker-qual");
    project.getDependencies().add(ErrorPronePlugin.CONFIGURATION_NAME, "com.google.errorprone:error_prone_core");
    project.getDependencies().add(ErrorPronePlugin.CONFIGURATION_NAME, "com.uber.nullaway:nullaway");
    project.getDependencies().add(ErrorPronePlugin.CONFIGURATION_NAME, "com.google.auto.value:auto-value-annotations");
    project.afterEvaluate(CuriostackRootPlugin::addStandardJavaTestDependencies);
    project.getConfigurations().all(configuration -> {
        configuration.resolutionStrategy(ResolutionStrategy::preferProjectModules);
        configuration.exclude(ImmutableMap.of("group", "com.google.guava", "module", "guava-jdk5"));
    });
    var javadoc = project.getTasks().withType(Javadoc.class).named("javadoc");
    javadoc.configure(t -> {
        CoreJavadocOptions options = (CoreJavadocOptions) t.getOptions();
        options.quiet();
        options.addBooleanOption("Xdoclint:all,-missing", true);
    });
    project.getTasks().register("resolveDependencies", resolveDependencies -> resolveDependencies.doLast(unused -> {
        project.getConfigurations().all(configuration -> {
            if (configuration.isCanBeResolved()) {
                configuration.resolve();
            }
        });
    }));
    project.getPlugins().withType(JMHPlugin.class, unused -> {
        JMHPluginExtension jmh = project.getExtensions().getByType(JMHPluginExtension.class);
        // Benchmarks are usually very small and converge quickly. If this stops being the
        // case
        // these numbers can be adjusted.
        jmh.setFork(2);
        jmh.setIterations(5);
        jmh.setProfilers(ImmutableList.of("hs_comp"));
        jmh.setJmhVersion("1.19");
        Object jmhRegex = project.getRootProject().findProperty("jmhRegex");
        if (jmhRegex != null) {
            jmh.setInclude((String) jmhRegex);
        }
    });
    project.getPlugins().withType(JooqPlugin.class, unused -> project.getTasks().withType(JooqTask.class).configureEach(t -> {
        for (String dependency : ImmutableList.of("javax.activation:activation", "mysql:mysql-connector-java", // Not sure why this isn't automatically added.
        "com.google.guava:guava", "com.google.cloud.sql:mysql-socket-factory")) {
            project.getDependencies().add("jooqRuntime", dependency);
        }
    }));
    // It is very common to want to pass in command line system properties to the binary, so just
    // always forward properties. It won't affect production since no one runs binaries via Gradle
    // in production.
    project.getTasks().withType(JavaExec.class).configureEach(task -> System.getProperties().entrySet().stream().filter(entry -> !((String) entry.getKey()).startsWith("java.")).forEach(entry -> task.systemProperty((String) entry.getKey(), entry.getValue())));
}
Also used : ErrorProneOptions(net.ltgt.gradle.errorprone.ErrorProneOptions) AwsSetupPlugin(org.curioswitch.gradle.plugins.aws.AwsSetupPlugin) MavenPublishPlugin(org.gradle.api.publish.maven.plugins.MavenPublishPlugin) CondaPlugin(org.curioswitch.gradle.conda.CondaPlugin) JavaPlugin(org.gradle.api.plugins.JavaPlugin) IdeaPlugin(org.gradle.plugins.ide.idea.IdeaPlugin) MonotonicNonNull(org.checkerframework.checker.nullness.qual.MonotonicNonNull) NodePlugin(org.curioswitch.gradle.plugins.nodejs.NodePlugin) Wrapper(org.gradle.api.tasks.wrapper.Wrapper) PublishingExtension(org.gradle.api.publish.PublishingExtension) Javadoc(org.gradle.api.tasks.javadoc.Javadoc) JibTask(org.curioswitch.gradle.golang.tasks.JibTask) GolangPlugin(org.curioswitch.gradle.golang.GolangPlugin) Locale(java.util.Locale) Map(java.util.Map) ExtensionAware(org.gradle.api.plugins.ExtensionAware) TestExceptionFormat(org.gradle.api.tasks.testing.logging.TestExceptionFormat) IdeaModule(org.gradle.plugins.ide.idea.model.IdeaModule) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) ReleasePlugin(org.curioswitch.gradle.release.ReleasePlugin) Project(org.gradle.api.Project) VariantVersionMappingStrategy(org.gradle.api.publish.VariantVersionMappingStrategy) Predicate(java.util.function.Predicate) CheckSeverity(net.ltgt.gradle.errorprone.CheckSeverity) ImmutableList.toImmutableList(com.google.common.collect.ImmutableList.toImmutableList) SetupGitHooks(org.curioswitch.gradle.plugins.curiostack.tasks.SetupGitHooks) DistributionType(org.gradle.api.tasks.wrapper.Wrapper.DistributionType) Set(java.util.Set) UpdateProjectSettingsTask(org.curioswitch.gradle.plugins.curiostack.tasks.UpdateProjectSettingsTask) SpotlessExtension(com.diffplug.gradle.spotless.SpotlessExtension) XmlParser(groovy.util.XmlParser) Collectors(java.util.stream.Collectors) JavaVersion(org.gradle.api.JavaVersion) StandardCharsets(java.nio.charset.StandardCharsets) NullAwayPlugin(net.ltgt.gradle.nullaway.NullAwayPlugin) UncheckedIOException(java.io.UncheckedIOException) CondaBuildEnvPlugin(org.curioswitch.gradle.conda.CondaBuildEnvPlugin) List(java.util.List) ToolDownloaderPlugin(org.curioswitch.gradle.tooldownloader.ToolDownloaderPlugin) CoreJavadocOptions(org.gradle.external.javadoc.CoreJavadocOptions) VersionsPlugin(com.github.benmanes.gradle.versions.VersionsPlugin) JavaPluginExtension(org.gradle.api.plugins.JavaPluginExtension) SAXException(org.xml.sax.SAXException) DependencyUpdatesTask(com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask) Optional(java.util.Optional) PluginContainer(org.gradle.api.plugins.PluginContainer) XmlProvider(org.gradle.api.XmlProvider) Pattern(java.util.regex.Pattern) JooqPlugin(nu.studer.gradle.jooq.JooqPlugin) QName(groovy.xml.QName) GenerateApiServerTask(org.curioswitch.gradle.plugins.curiostack.tasks.GenerateApiServerTask) DeprecatableConfiguration(org.gradle.internal.deprecation.DeprecatableConfiguration) ERROR(net.ltgt.gradle.errorprone.CheckSeverity.ERROR) CurioGenericCiPlugin(org.curioswitch.gradle.plugins.ci.CurioGenericCiPlugin) ErrorPronePlugin(net.ltgt.gradle.errorprone.ErrorPronePlugin) CondaExtension(org.curioswitch.gradle.conda.CondaExtension) HashMap(java.util.HashMap) GolangExtension(org.curioswitch.gradle.golang.GolangExtension) BasePlugin(org.gradle.api.plugins.BasePlugin) MavenPublication(org.gradle.api.publish.maven.MavenPublication) DownloadToolUtil(org.curioswitch.gradle.tooldownloader.util.DownloadToolUtil) SourceSet(org.gradle.api.tasks.SourceSet) Configuration(org.gradle.api.artifacts.Configuration) TargetJvmVersion(org.gradle.api.attributes.java.TargetJvmVersion) JMHPluginExtension(me.champeau.gradle.JMHPluginExtension) ImmutableList(com.google.common.collect.ImmutableList) DependencyHandler(org.gradle.api.artifacts.dsl.DependencyHandler) JooqTask(nu.studer.gradle.jooq.JooqTask) DownloadedToolManager(org.curioswitch.gradle.tooldownloader.DownloadedToolManager) UpdateGradleWrapperTask(org.curioswitch.gradle.plugins.curiostack.tasks.UpdateGradleWrapperTask) CreateShellConfigTask(org.curioswitch.gradle.plugins.curiostack.tasks.CreateShellConfigTask) NodeUtil(org.curioswitch.gradle.plugins.nodejs.util.NodeUtil) Test(org.gradle.api.tasks.testing.Test) OFF(net.ltgt.gradle.errorprone.CheckSeverity.OFF) JavaCompile(org.gradle.api.tasks.compile.JavaCompile) Resources(com.google.common.io.Resources) Files(java.nio.file.Files) JavaPluginConvention(org.gradle.api.plugins.JavaPluginConvention) JacocoPlugin(org.gradle.testing.jacoco.plugins.JacocoPlugin) JMHPlugin(me.champeau.gradle.JMHPlugin) UpdateIntelliJSdksTask(org.curioswitch.gradle.plugins.curiostack.tasks.UpdateIntelliJSdksTask) IOException(java.io.IOException) Node(groovy.util.Node) GcloudPlugin(org.curioswitch.gradle.plugins.gcloud.GcloudPlugin) GolangSetupPlugin(org.curioswitch.gradle.golang.GolangSetupPlugin) SpotlessPlugin(com.diffplug.gradle.spotless.SpotlessPlugin) ResolutionStrategy(org.gradle.api.artifacts.ResolutionStrategy) TerraformSetupPlugin(org.curioswitch.gradle.plugins.terraform.TerraformSetupPlugin) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) NullAwayOptions(net.ltgt.gradle.nullaway.NullAwayOptions) JavaExec(org.gradle.api.tasks.JavaExec) WARN(net.ltgt.gradle.errorprone.CheckSeverity.WARN) Plugin(org.gradle.api.Plugin) Copy(org.gradle.api.tasks.Copy) PluginContainer(org.gradle.api.plugins.PluginContainer) ErrorProneOptions(net.ltgt.gradle.errorprone.ErrorProneOptions) MavenPublication(org.gradle.api.publish.maven.MavenPublication) Javadoc(org.gradle.api.tasks.javadoc.Javadoc) DeprecatableConfiguration(org.gradle.internal.deprecation.DeprecatableConfiguration) ResolutionStrategy(org.gradle.api.artifacts.ResolutionStrategy) Project(org.gradle.api.Project) CoreJavadocOptions(org.gradle.external.javadoc.CoreJavadocOptions) IdeaModule(org.gradle.plugins.ide.idea.model.IdeaModule) JavaPluginConvention(org.gradle.api.plugins.JavaPluginConvention) JavaExec(org.gradle.api.tasks.JavaExec) MonotonicNonNull(org.checkerframework.checker.nullness.qual.MonotonicNonNull) JMHPluginExtension(me.champeau.gradle.JMHPluginExtension) JavaCompile(org.gradle.api.tasks.compile.JavaCompile)

Aggregations

Action (org.gradle.api.Action)2 InvalidUserCodeException (org.gradle.api.InvalidUserCodeException)2 ImmutableAttributes (org.gradle.api.internal.attributes.ImmutableAttributes)2 VariantVersionMappingStrategy (org.gradle.api.publish.VariantVersionMappingStrategy)2 AttributeMatcher (org.gradle.internal.component.model.AttributeMatcher)2 SpotlessExtension (com.diffplug.gradle.spotless.SpotlessExtension)1 SpotlessPlugin (com.diffplug.gradle.spotless.SpotlessPlugin)1 VersionsPlugin (com.github.benmanes.gradle.versions.VersionsPlugin)1 DependencyUpdatesTask (com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask)1 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableList.toImmutableList (com.google.common.collect.ImmutableList.toImmutableList)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 ImmutableSet (com.google.common.collect.ImmutableSet)1 Resources (com.google.common.io.Resources)1 Node (groovy.util.Node)1 XmlParser (groovy.util.XmlParser)1 QName (groovy.xml.QName)1 IOException (java.io.IOException)1 UncheckedIOException (java.io.UncheckedIOException)1 StandardCharsets (java.nio.charset.StandardCharsets)1