diff --git a/README.md b/README.md index 7e2f91a..9b5be5e 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,22 @@ offlineDependencies { } ``` +You can additionally override ```offlineIvyRepositoryRoot``` to separate Ivy dependencies from Maven dependencies: +```gradle +repositories { + ivy { + url offlineIvyRepositoryRoot + layout 'pattern', { + artifact '[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]' + ivy '[organisation]/[module]/[revision]/ivy-[revision].xml' + m2compatible = true + } + } +} +``` +This may be necessary if you use both maven and ivy repositories in the same build and you use custom ivy configurations. + + ## Tasks Currently the plugin only exposes a single task: @@ -126,7 +142,7 @@ offlineDependencies { } ``` -Just make sure that the `offlineRepositoryRoot` repository is first in the list. +Just make sure that the `offlineRepositoryRoot` (and `offlineIvyRepositoryRoot`, if used) repository is before the remote repositories. ## Example build.gradle diff --git a/src/main/groovy/io/pry/gradle/offline_dependencies/OfflineDependenciesPlugin.groovy b/src/main/groovy/io/pry/gradle/offline_dependencies/OfflineDependenciesPlugin.groovy index eeb0e89..a2a3a11 100644 --- a/src/main/groovy/io/pry/gradle/offline_dependencies/OfflineDependenciesPlugin.groovy +++ b/src/main/groovy/io/pry/gradle/offline_dependencies/OfflineDependenciesPlugin.groovy @@ -29,8 +29,15 @@ class OfflineDependenciesPlugin implements Plugin { project.logger.info("Offline dependencies root configured at '${project.ext.offlineRepositoryRoot}'") + if (project.hasProperty("offlineIvyRepositoryRoot")) { + project.logger.info("Offline ivy dependencies root configured at '${project.ext.offlineIvyRepositoryRoot}'") + } else { + project.ext.offlineIvyRepositoryRoot = project.offlineRepositoryRoot + } + project.task('updateOfflineRepository', type: UpdateOfflineRepositoryTask) { conventionMapping.root = { "${project.offlineRepositoryRoot}" } + conventionMapping.ivyRoot = { "${project.offlineIvyRepositoryRoot}" } conventionMapping.configurationNames = { extension.configurations } conventionMapping.buildscriptConfigurationNames = { extension.buildScriptConfigurations } conventionMapping.includeSources = { extension.includeSources } diff --git a/src/main/groovy/io/pry/gradle/offline_dependencies/UpdateOfflineRepositoryTask.groovy b/src/main/groovy/io/pry/gradle/offline_dependencies/UpdateOfflineRepositoryTask.groovy index 3a9a72c..86f59b5 100644 --- a/src/main/groovy/io/pry/gradle/offline_dependencies/UpdateOfflineRepositoryTask.groovy +++ b/src/main/groovy/io/pry/gradle/offline_dependencies/UpdateOfflineRepositoryTask.groovy @@ -14,6 +14,7 @@ import org.gradle.api.artifacts.ExternalModuleDependency import org.gradle.api.artifacts.UnknownConfigurationException import org.gradle.api.artifacts.component.ComponentIdentifier import org.gradle.api.artifacts.component.ModuleComponentIdentifier +import org.gradle.api.artifacts.result.ComponentArtifactsResult import org.gradle.api.artifacts.result.UnresolvedArtifactResult import org.gradle.api.internal.artifacts.DefaultModuleIdentifier import org.gradle.api.tasks.Input @@ -27,6 +28,7 @@ import org.gradle.language.java.artifact.JavadocArtifact import org.gradle.maven.MavenModule import org.gradle.maven.MavenPomArtifact import org.gradle.util.GFileUtils +import java.util.Set; import static io.pry.gradle.offline_dependencies.Utils.addToMultimap @@ -37,6 +39,8 @@ class UpdateOfflineRepositoryTask extends DefaultTask { @Input GString root @Input + GString ivyRoot + @Input Set configurationNames @Input Set buildscriptConfigurationNames @@ -50,6 +54,8 @@ class UpdateOfflineRepositoryTask extends DefaultTask { boolean includeIvyXmls @Input boolean includeBuildscriptDependencies + + private Set ivyComponentIds = [] as Set @TaskAction void run() { @@ -174,9 +180,21 @@ class UpdateOfflineRepositoryTask extends DefaultTask { collectPoms(componentIds, repositoryFiles) } + def ivyComponents = [] as Set + //If we need to keep track of ivy stuff separately keep track of what the ivy dependencies are + if (!root.equals(ivyRoot) || this.getIncludeIvyXmls()) { + def ivyArtifacts = project.dependencies.createArtifactResolutionQuery() + .forComponents(componentIds) + .withArtifacts(IvyModule, IvyDescriptorArtifact) + .execute() + ivyComponents = ivyArtifacts.resolvedComponents + + ivyComponentIds = ivyComponents.collect { it.getId() } as Set + } + // collect ivy xml files - if (this.getIncludeIvyXmls()) { - collectIvyXmls(componentIds, repositoryFiles) + if (this.getIncludeIvyXmls() && !ivyComponents.isEmpty()) { + collectIvyXmls(componentIds, repositoryFiles, ivyComponents) } return repositoryFiles @@ -261,15 +279,10 @@ class UpdateOfflineRepositoryTask extends DefaultTask { } } - private void collectIvyXmls(Set componentIds, Map> repositoryFiles) { + private void collectIvyXmls(Set componentIds, Map> repositoryFiles, Set ivyComponents) { logger.trace("Collecting ivy xml files") - def ivyArtifacts = project.dependencies.createArtifactResolutionQuery() - .forComponents(componentIds) - .withArtifacts(IvyModule, IvyDescriptorArtifact) - .execute() - - for (component in ivyArtifacts.resolvedComponents) { + for (component in ivyComponents) { def ivyXmls = component.getArtifacts(IvyDescriptorArtifact) if (ivyXmls?.empty) { @@ -311,7 +324,8 @@ class UpdateOfflineRepositoryTask extends DefaultTask { // Return the offline-repository target directory for the given component (naming follows maven conventions) protected File moduleDirectory(ModuleComponentIdentifier ci) { - new File("${getRoot()}".toString(), "${ci.group.tokenize(".").join("/")}/${ci.module}/${ci.version}") + new File("${ivyComponentIds.contains(ci) ? getIvyRoot() : getRoot()}".toString(), "${ci.group.tokenize(".").join("/")}/${ci.module}/${ci.version}") } + }