Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,15 @@ class OfflineDependenciesPlugin implements Plugin<Project> {

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 }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -37,6 +39,8 @@ class UpdateOfflineRepositoryTask extends DefaultTask {
@Input
GString root
@Input
GString ivyRoot
@Input
Set<String> configurationNames
@Input
Set<String> buildscriptConfigurationNames
Expand All @@ -50,6 +54,8 @@ class UpdateOfflineRepositoryTask extends DefaultTask {
boolean includeIvyXmls
@Input
boolean includeBuildscriptDependencies

private Set<ModuleComponentIdentifier> ivyComponentIds = [] as Set

@TaskAction
void run() {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -261,15 +279,10 @@ class UpdateOfflineRepositoryTask extends DefaultTask {
}
}

private void collectIvyXmls(Set<ComponentIdentifier> componentIds, Map<ComponentIdentifier, Set<File>> repositoryFiles) {
private void collectIvyXmls(Set<ComponentIdentifier> componentIds, Map<ComponentIdentifier, Set<File>> repositoryFiles, Set<ComponentArtifactsResult> 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) {
Expand Down Expand Up @@ -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}")
}

}