mirror of
https://gitee.com/dcren/initializr.git
synced 2025-07-16 16:50:42 +08:00
Allow to customize how build writers sort dependencies
Closes gh-1098
This commit is contained in:
parent
d665620a91
commit
eed9c3876f
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@ -142,6 +142,14 @@ public abstract class GradleBuildWriter {
|
||||
return (scope) -> Arrays.asList(validScopes).contains(scope);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the {@link Comparator} to use to sort dependencies.
|
||||
* @return a dependency comparator
|
||||
*/
|
||||
protected Comparator<Dependency> getDependencyComparator() {
|
||||
return DependencyComparator.INSTANCE;
|
||||
}
|
||||
|
||||
protected abstract void writeDependency(IndentingWriter writer, Dependency dependency);
|
||||
|
||||
protected String configurationForDependency(Dependency dependency) {
|
||||
@ -242,9 +250,9 @@ public abstract class GradleBuildWriter {
|
||||
|
||||
protected abstract void writeProperty(IndentingWriter writer, String name, String value);
|
||||
|
||||
private static Collection<Dependency> filterDependencies(DependencyContainer dependencies,
|
||||
private Collection<Dependency> filterDependencies(DependencyContainer dependencies,
|
||||
Predicate<DependencyScope> filter) {
|
||||
return dependencies.items().filter((dep) -> filter.test(dep.getScope())).sorted(DependencyComparator.INSTANCE)
|
||||
return dependencies.items().filter((dep) -> filter.test(dep.getScope())).sorted(getDependencyComparator())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
@ -83,6 +83,14 @@ public class MavenBuildWriter {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the {@link Comparator} to use to sort dependencies.
|
||||
* @return a dependency comparator
|
||||
*/
|
||||
protected Comparator<Dependency> getDependencyComparator() {
|
||||
return DependencyComparator.INSTANCE;
|
||||
}
|
||||
|
||||
private void writeProject(IndentingWriter writer, Runnable whenWritten) {
|
||||
writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
||||
writer.println(
|
||||
@ -214,7 +222,7 @@ public class MavenBuildWriter {
|
||||
private Collection<Dependency> writeDependencies(IndentingWriter writer, DependencyContainer dependencies,
|
||||
Predicate<DependencyScope> filter) {
|
||||
Collection<Dependency> candidates = dependencies.items().filter((dep) -> filter.test(dep.getScope()))
|
||||
.sorted(DependencyComparator.INSTANCE).collect(Collectors.toList());
|
||||
.sorted(getDependencyComparator()).collect(Collectors.toList());
|
||||
writeCollection(writer, candidates, this::writeDependency);
|
||||
return candidates;
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ package io.spring.initializr.generator.buildsystem.gradle;
|
||||
|
||||
import java.io.StringWriter;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import io.spring.initializr.generator.buildsystem.BillOfMaterials;
|
||||
@ -415,6 +416,41 @@ class GroovyDslGradleBuildWriterTests {
|
||||
"}");
|
||||
}
|
||||
|
||||
@Test
|
||||
void gradleBuildWithOrderedDependencies() {
|
||||
GradleBuild build = new GradleBuild();
|
||||
build.dependencies().add("beta", Dependency.withCoordinates("com.example", "beta"));
|
||||
build.dependencies().add("alpha", Dependency.withCoordinates("com.example", "alpha"));
|
||||
build.dependencies().add("web",
|
||||
Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter-web"));
|
||||
build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter"));
|
||||
List<String> lines = generateBuild(build);
|
||||
assertThat(lines).containsSequence(" implementation 'org.springframework.boot:spring-boot-starter'",
|
||||
" implementation 'org.springframework.boot:spring-boot-starter-web'",
|
||||
" implementation 'com.example:alpha'", " implementation 'com.example:beta'");
|
||||
}
|
||||
|
||||
@Test
|
||||
void gradleBuildWithOrderedDependenciesAndCustomComparator() {
|
||||
GradleBuild build = new GradleBuild();
|
||||
build.dependencies().add("beta", Dependency.withCoordinates("com.example", "beta"));
|
||||
build.dependencies().add("alpha", Dependency.withCoordinates("com.example", "alpha"));
|
||||
build.dependencies().add("web",
|
||||
Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter-web"));
|
||||
build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter"));
|
||||
GroovyDslGradleBuildWriter writer = new GroovyDslGradleBuildWriter() {
|
||||
@Override
|
||||
protected Comparator<Dependency> getDependencyComparator() {
|
||||
return Comparator.comparing(Dependency::getArtifactId);
|
||||
}
|
||||
};
|
||||
List<String> lines = generateBuild(writer, build);
|
||||
assertThat(lines).containsSequence(" implementation 'com.example:alpha'",
|
||||
" implementation 'com.example:beta'",
|
||||
" implementation 'org.springframework.boot:spring-boot-starter'",
|
||||
" implementation 'org.springframework.boot:spring-boot-starter-web'");
|
||||
}
|
||||
|
||||
@Test
|
||||
void gradleBuildWithBom() {
|
||||
GradleBuild build = new GradleBuild();
|
||||
@ -447,7 +483,10 @@ class GroovyDslGradleBuildWriterTests {
|
||||
}
|
||||
|
||||
private List<String> generateBuild(GradleBuild build) {
|
||||
GradleBuildWriter writer = new GroovyDslGradleBuildWriter();
|
||||
return generateBuild(new GroovyDslGradleBuildWriter(), build);
|
||||
}
|
||||
|
||||
private List<String> generateBuild(GroovyDslGradleBuildWriter writer, GradleBuild build) {
|
||||
StringWriter out = new StringWriter();
|
||||
writer.writeTo(new IndentingWriter(out), build);
|
||||
String[] lines = out.toString().split("\\r?\\n");
|
||||
|
@ -18,6 +18,7 @@ package io.spring.initializr.generator.buildsystem.gradle;
|
||||
|
||||
import java.io.StringWriter;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import io.spring.initializr.generator.buildsystem.BillOfMaterials;
|
||||
@ -424,6 +425,41 @@ class KotlinDslGradleBuildWriterTests {
|
||||
"}");
|
||||
}
|
||||
|
||||
@Test
|
||||
void gradleBuildWithOrderedDependencies() {
|
||||
GradleBuild build = new GradleBuild();
|
||||
build.dependencies().add("beta", Dependency.withCoordinates("com.example", "beta"));
|
||||
build.dependencies().add("alpha", Dependency.withCoordinates("com.example", "alpha"));
|
||||
build.dependencies().add("web",
|
||||
Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter-web"));
|
||||
build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter"));
|
||||
List<String> lines = generateBuild(build);
|
||||
assertThat(lines).containsSequence(" implementation(\"org.springframework.boot:spring-boot-starter\")",
|
||||
" implementation(\"org.springframework.boot:spring-boot-starter-web\")",
|
||||
" implementation(\"com.example:alpha\")", " implementation(\"com.example:beta\")");
|
||||
}
|
||||
|
||||
@Test
|
||||
void gradleBuildWithOrderedDependenciesAndCustomComparator() {
|
||||
GradleBuild build = new GradleBuild();
|
||||
build.dependencies().add("beta", Dependency.withCoordinates("com.example", "beta"));
|
||||
build.dependencies().add("alpha", Dependency.withCoordinates("com.example", "alpha"));
|
||||
build.dependencies().add("web",
|
||||
Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter-web"));
|
||||
build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter"));
|
||||
KotlinDslGradleBuildWriter writer = new KotlinDslGradleBuildWriter() {
|
||||
@Override
|
||||
protected Comparator<Dependency> getDependencyComparator() {
|
||||
return Comparator.comparing(Dependency::getArtifactId);
|
||||
}
|
||||
};
|
||||
List<String> lines = generateBuild(writer, build);
|
||||
assertThat(lines).containsSequence(" implementation(\"com.example:alpha\")",
|
||||
" implementation(\"com.example:beta\")",
|
||||
" implementation(\"org.springframework.boot:spring-boot-starter\")",
|
||||
" implementation(\"org.springframework.boot:spring-boot-starter-web\")");
|
||||
}
|
||||
|
||||
@Test
|
||||
void gradleBuildWithBom() {
|
||||
GradleBuild build = new GradleBuild();
|
||||
@ -456,7 +492,10 @@ class KotlinDslGradleBuildWriterTests {
|
||||
}
|
||||
|
||||
private List<String> generateBuild(GradleBuild build) {
|
||||
GradleBuildWriter writer = new KotlinDslGradleBuildWriter();
|
||||
return generateBuild(new KotlinDslGradleBuildWriter(), build);
|
||||
}
|
||||
|
||||
private List<String> generateBuild(KotlinDslGradleBuildWriter writer, GradleBuild build) {
|
||||
StringWriter out = new StringWriter();
|
||||
writer.writeTo(new IndentingWriter(out), build);
|
||||
String[] lines = out.toString().split("\\r?\\n");
|
||||
|
@ -17,6 +17,7 @@
|
||||
package io.spring.initializr.generator.buildsystem.maven;
|
||||
|
||||
import java.io.StringWriter;
|
||||
import java.util.Comparator;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import io.spring.initializr.generator.buildsystem.BillOfMaterials;
|
||||
@ -420,6 +421,39 @@ class MavenBuildWriterTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void pomWithOrderedDependencies() {
|
||||
MavenBuild build = new MavenBuild();
|
||||
build.dependencies().add("beta", Dependency.withCoordinates("com.example", "beta"));
|
||||
build.dependencies().add("alpha", Dependency.withCoordinates("com.example", "alpha"));
|
||||
build.dependencies().add("web",
|
||||
Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter-web"));
|
||||
build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter"));
|
||||
String pom = writePom(new MavenBuildWriter(), build);
|
||||
assertThat(pom).containsSubsequence("<artifactId>spring-boot-starter</artifactId>",
|
||||
"<artifactId>spring-boot-starter-web</artifactId>", "<artifactId>alpha</artifactId>",
|
||||
"<artifactId>beta</artifactId>");
|
||||
}
|
||||
|
||||
@Test
|
||||
void pomWithOrderedDependenciesAndCustomComparator() {
|
||||
MavenBuild build = new MavenBuild();
|
||||
build.dependencies().add("beta", Dependency.withCoordinates("com.example", "beta"));
|
||||
build.dependencies().add("alpha", Dependency.withCoordinates("com.example", "alpha"));
|
||||
build.dependencies().add("web",
|
||||
Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter-web"));
|
||||
build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter"));
|
||||
MavenBuildWriter writer = new MavenBuildWriter() {
|
||||
@Override
|
||||
protected Comparator<Dependency> getDependencyComparator() {
|
||||
return Comparator.comparing(Dependency::getArtifactId);
|
||||
}
|
||||
};
|
||||
String pom = writePom(writer, build);
|
||||
assertThat(pom).containsSubsequence("<artifactId>alpha</artifactId>", "<artifactId>beta</artifactId>",
|
||||
"<artifactId>spring-boot-starter</artifactId>", "<artifactId>spring-boot-starter-web</artifactId>");
|
||||
}
|
||||
|
||||
@Test
|
||||
void pomWithBom() {
|
||||
MavenBuild build = new MavenBuild();
|
||||
@ -822,17 +856,16 @@ class MavenBuildWriterTests {
|
||||
MavenBuild build = new MavenBuild();
|
||||
build.settings().coordinates("com.example.demo", "demo").name("<demo project>")
|
||||
.description("A \"demo\" project for 'developers' & 'testers'");
|
||||
String pom = writePom(build);
|
||||
String pom = writePom(new MavenBuildWriter(), build);
|
||||
assertThat(pom).contains("<name><demo project></name>").contains(
|
||||
"<description>A "demo" project for 'developers' & 'testers'</description>");
|
||||
}
|
||||
|
||||
private void generatePom(MavenBuild mavenBuild, Consumer<NodeAssert> consumer) {
|
||||
consumer.accept(new NodeAssert(writePom(mavenBuild)));
|
||||
consumer.accept(new NodeAssert(writePom(new MavenBuildWriter(), mavenBuild)));
|
||||
}
|
||||
|
||||
private String writePom(MavenBuild mavenBuild) {
|
||||
MavenBuildWriter writer = new MavenBuildWriter();
|
||||
private String writePom(MavenBuildWriter writer, MavenBuild mavenBuild) {
|
||||
StringWriter out = new StringWriter();
|
||||
writer.writeTo(new IndentingWriter(out), mavenBuild);
|
||||
return out.toString();
|
||||
|
Loading…
Reference in New Issue
Block a user