Update BuildInfo to support Gradle's configuration cache

See gh-22922
This commit is contained in:
Andy Wilkinson
2020-10-01 20:58:22 +01:00
parent 83cfd3b2e6
commit d1f543fc1d
13 changed files with 148 additions and 44 deletions

View File

@@ -24,6 +24,7 @@ import java.util.Map;
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.internal.ConventionTask;
import org.gradle.api.tasks.Nested;
import org.gradle.api.tasks.OutputDirectory;
@@ -44,7 +45,12 @@ public class BuildInfo extends ConventionTask {
private final BuildInfoProperties properties = new BuildInfoProperties(getProject());
private File destinationDir;
private final DirectoryProperty destinationDir;
public BuildInfo() {
this.destinationDir = getProject().getObjects().directoryProperty()
.convention(getProject().getLayout().getBuildDirectory());
}
/**
* Generates the {@code build-info.properties} file in the configured
@@ -73,7 +79,7 @@ public class BuildInfo extends ConventionTask {
*/
@OutputDirectory
public File getDestinationDir() {
return (this.destinationDir != null) ? this.destinationDir : getProject().getBuildDir();
return this.destinationDir.getAsFile().get();
}
/**
@@ -81,7 +87,7 @@ public class BuildInfo extends ConventionTask {
* @param destinationDir the destination directory
*/
public void setDestinationDir(File destinationDir) {
this.destinationDir = destinationDir;
this.destinationDir.set(destinationDir);
}
/**

View File

@@ -16,6 +16,8 @@
package org.springframework.boot.gradle.tasks.buildinfo;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.time.Instant;
import java.util.HashMap;
@@ -23,6 +25,7 @@ import java.util.Map;
import org.gradle.api.Project;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Optional;
@@ -35,6 +38,8 @@ import org.gradle.api.tasks.Optional;
@SuppressWarnings("serial")
public class BuildInfoProperties implements Serializable {
private transient Instant creationTime = Instant.now();
private final Property<String> group;
private final Property<String> artifact;
@@ -43,22 +48,35 @@ public class BuildInfoProperties implements Serializable {
private final Property<String> name;
private final Property<Instant> time;
private final Property<Long> time;
private boolean timeConfigured = false;
private Map<String, Object> additionalProperties = new HashMap<>();
BuildInfoProperties(Project project) {
this.time = project.getObjects().property(Instant.class);
this.time.set(Instant.now());
this.time = project.getObjects().property(Long.class);
this.group = project.getObjects().property(String.class);
this.group.set(project.provider(() -> project.getGroup().toString()));
this.artifact = project.getObjects().property(String.class);
this.version = project.getObjects().property(String.class);
this.version.set(project.provider(() -> project.getVersion().toString()));
this.version.set(projectVersion(project));
this.name = project.getObjects().property(String.class);
this.name.set(project.provider(project::getName));
}
private Provider<String> projectVersion(Project project) {
try {
Provider<String> externalVersionProperty = project.getProviders().gradleProperty("version")
.forUseAtConfigurationTime();
externalVersionProperty.getOrNull();
}
catch (NoSuchMethodError ex) {
// Gradle < 6.5
}
return project.provider(() -> project.getVersion().toString());
}
/**
* Returns the value used for the {@code build.group} property. Defaults to the
* {@link Project#getGroup() Project's group}.
@@ -142,7 +160,14 @@ public class BuildInfoProperties implements Serializable {
@Input
@Optional
public Instant getTime() {
return this.time.getOrNull();
Long epochMillis = this.time.getOrNull();
if (epochMillis != null) {
return Instant.ofEpochMilli(epochMillis);
}
if (this.timeConfigured) {
return null;
}
return this.creationTime;
}
/**
@@ -150,7 +175,8 @@ public class BuildInfoProperties implements Serializable {
* @param time the build time
*/
public void setTime(Instant time) {
this.time.set(time);
this.timeConfigured = true;
this.time.set((time != null) ? time.toEpochMilli() : null);
}
/**
@@ -173,4 +199,9 @@ public class BuildInfoProperties implements Serializable {
this.additionalProperties = additionalProperties;
}
private void readObject(ObjectInputStream input) throws ClassNotFoundException, IOException {
input.defaultReadObject();
this.creationTime = Instant.now();
}
}