Maven and Ivy Repository Generation - nebula-plugins/nebula-test GitHub Wiki
Generating Test Maven and Ivy Repos
More detailed information can be found on our wiki.
Caveats:
- this will not check whether the dependency graph you describe is valid
- all listed dependencies will be in the runtime scope of the generated library
Describing a Dependency Graph (String based)
Simple Library with no Dependencies
If i want to create a fake library with group: test.example
, artifactName: foo
, and version: 1.0.0
String myGraph = 'test.example:foo:1.0.0'
Library with One Dependency
To have test.example:foo:1.0.0
depend on the most recent version in the 1.+
series of bar:baz
String myGraph = 'test.example:foo:1.0.0 -> bar:baz:1.+'
Library with Multiple Dependencies
To have test.example:foo:1.0.0
depend on bar:baz:1.+
, g:a:[1.0.0,2.0.0)
, and g1:a1:3.1.2
String myGraph = 'test.example:foo:1.0.0 -> bar:baz:1.+|g:a:[1.0.0,2.0.0)|g1:a1:3.1.2'
Describing a Dependency Graph (Builder based)
def builder = new DependencyGraphBuilder()
DependencyGraph graph = builder.build()
Simple Library with no Dependencies
If i want to create a fake library with group: test.example
, artifactName: foo
, and version: 1.0.0
builder.addModule('test.example:foo:1.0.0')
//or
builder.addModule('test.example', 'foo', '1.0.0')
//or
def module = new ModuleBuilder('test.example:foo:1.0.0').build()
builder.addModule(module)
Library with One Dependency
To have test.example:foo:1.0.0
depend on the most recent version in the 1.+
series of bar:baz
def module = new ModuleBuilder('test.example:foo:1.0.0').addDependency('bar:baz:1.+').build()
builder.addModule(module)
Library with Multiple Dependencies
To have test.example:foo:1.0.0
depend on bar:baz:1.+
, g:a:[1.0.0,2.0.0)
, and g1:a1:3.1.2
def module = new ModuleBuilder('test.example:foo:1.0.0')
.addDependency('bar:baz:1.+')
.addDependency('g:a:[1.0.0,2.0.0)').build()
builder.addModule(module)
Creating the Graph
String based syntax
import nebula.test.dependencies.DependencyGraph
def graph = new DependencyGraph(['g:a:1.0.0', 'g1:a1:0.9.0 -> g:a:1.+'])
// or
def graph = new DependencyGraph('g:a:1.0.0', 'g1:a1:0.9.0 -> g:a:1.+')
Builder based syntax
import nebula.test.dependencies.DependencyGraphBuilder
import nebula.test.dependencies.ModuleBuilder
def graph = new DependencyGraphBuilder().addModule('g0:a0:0.0.1')
.addModule('g1', 'a1', '1.0.1')
.addModule(new ModuleBuilder('g2:a2:2.0.1').build())
.addModule(new ModuleBuilder('g3', 'a3', '3.0.1')
.addDependency('g4:a4:4.0.1')
.addDependency('g5', 'a5', '5.0.1').build()
).build()
Generating A Repository
Given
def generator = new GradleDependencyGenerator(graph)
- ivy repos will be at: generator.ivyRepoDir
- maven repos will be at: generator.mavenRepoDir
Code example:
import nebula.test.dependencies.GradleDependencyGenerator
def graph = new DependencyGraph(['g:a:1.0.0', 'g1:a1:0.9.0 -> g:a:1.+'])
def generator = new GradleDependencyGenerator(graph)
// or to specify directory of repos
def generator = new GradleDependencyGenerator(graph, 'build/testrepos')
To create a maven repo
File mavenrepo = generator.generateTestMavenRepo()
To create an ivy repo
File ivyrepo = generator.generateTestIvyRepo()
Create an ivy dependency with specific status
def builder = new DependencyGraphBuilder()
DependencyGraphNode module = new ModuleBuilder('bar', 'foo', '1.0.0').setStatus('snapshot').build()
builder.addModule(module)
def graph = buidler.build()
If you want to use a module with specific status as a dependency of another module you have to create it first with ModuleBuilder
and then assign it as a dependency.
def builder = new DependencyGraphBuilder()
DependencyGraphNode module = new ModuleBuilder('bar', 'foo', '1.0.0').setStatus('snapshot').build()
builder.addModule(module)
builder.addModule(new ModuleBuilder('g1', 'a1', '1.0.1').addDependency('bar:foo:1.0.0').build())
def graph = buidler.build()
targetCompatibility
when using Gradle 6+ (since 7.5.0)
Create dependencies with specific Gradle 6+ will publish Gradle metadata by default. When that version is used for tests DependencyGraphBuilder will create all dependencies with Gradle metadata. You can specify custom target compatibility. We set it by default to Java 8. Here is an example of how to create a dependency with a different compatibility
def graph = [
new DependencyGraphNode(coordinate: new Coordinate(group: 'test.ivy', artifact: 'foo-final', version: '1.0.0'), status: "release", targetCompatibility: JavaVersion.VERSION_1_7),
]
def generator = new GradleDependencyGenerator(new DependencyGraph(nodes: graph), directory)