How to add a dependency constraint to a grade project from a custom gradle plugin?

Viewed 216

How to add a dependency constraint to a project from a custom gradle plugin?

I want to create a gradle plugin that will constrain transitive dependencies in the project the plugin is applied to. Ideally, I want this plugin to follow the following rules:

  • Only try and apply a constraint to a project if the it exists in the project. E.g. only apply a constraint on dependency X if dependency X is pulled into the project.
  • Apply the constraints automatically on application of the plugin, I don't want to create/run an extra task or anything like that.
  • (Bonus) Don't apply the constraints to primary dependencies, only transitive dependencies.

Here's what I have so far.

class ConstraintPlugin implements Plugin<Project> {

    private Map<String, String> constraintMap = [
            "jackson-core": "2.13.2",
            "logback-classic": "2.3.9"
    ]

    @Override
    void apply(Project project) {

        project.configurations.each {config ->
            config.resolvedConfiguration.resolvedArtifacts.each {dep ->
                if (constraintMap.containsKey(dep.name)) {
                    ModuleVersionIdentifier id = dep.moduleVersion.id
                    String constraintVersion = constraintMap.get(id.name)

                    DependencyConstraint dc = new DefaultDependencyConstraint(id.group, id.name, constraintVersion)

                    config.dependencyConstraints.add(dc)
                }
            }
        }

I'm using a map instantiated within the constraint plugin class with the names of the dependencies I want to constrain along with the versions to constrain to in the project this plugin is applied to. Here I want to constrain the jackson-core and logback-classic dependencies.

My first thought was to run through each configuration and see if that dependency name is present within that configuration. If so, create a new DependencyConstraint and add it to the configuration. However this is not working when I apply the plugin to another project.

Also note I am not disregarding primary dependencies quite yet, this feature is more like a "nice to have" at this point, I haven't figured out how to only look at transitive dependencies within a given configuration.

I think my issue lies with how I am applying the new DependencyConstraint programmatically but I can't seem to find a way to add a constraint that works. The only other way I've tried is project.dependencies.constraints.create(dc) which also doesn't work.

0 Answers
Related