use of org.gradle.api.tasks.Sync in project gradle by gradle.
the class DistributionPlugin method addInstallTask.
private void addInstallTask(final Project project, final Distribution distribution) {
String taskName = TASK_INSTALL_NAME;
if (!MAIN_DISTRIBUTION_NAME.equals(distribution.getName())) {
taskName = "install" + StringGroovyMethods.capitalize(distribution.getName()) + "Dist";
}
Sync installTask = project.getTasks().create(taskName, Sync.class);
installTask.setDescription("Installs the project as a distribution as-is.");
installTask.setGroup(DISTRIBUTION_GROUP);
installTask.with(distribution.getContents());
installTask.into(new Callable<File>() {
@Override
public File call() throws Exception {
return project.file("" + project.getBuildDir() + "/install/" + distribution.getBaseName());
}
});
}
use of org.gradle.api.tasks.Sync in project gradle by gradle.
the class OsgiPlugin method apply.
public void apply(final Project project) {
project.getPluginManager().apply(JavaBasePlugin.class);
final OsgiPluginConvention osgiConvention = new OsgiPluginConvention((ProjectInternal) project);
project.getConvention().getPlugins().put("osgi", osgiConvention);
project.getPlugins().withType(JavaPlugin.class, new Action<JavaPlugin>() {
@Override
public void execute(JavaPlugin javaPlugin) {
// When creating the OSGi manifest, we must have a single view of all of the classes included in the jar.
Sync prepareOsgiClasses = project.getTasks().create("osgiClasses", Sync.class);
FileCollection classes = project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().getByName("main").getOutput().getClassesDirs();
File singleClassesDirectory = new File(project.getBuildDir(), "osgi-classes");
prepareOsgiClasses.setDescription("Prepares a single classes directory required for OSGi analysis.");
prepareOsgiClasses.from(classes);
prepareOsgiClasses.into(singleClassesDirectory);
Jar jarTask = (Jar) project.getTasks().getByName("jar");
jarTask.dependsOn(prepareOsgiClasses);
OsgiManifest osgiManifest = osgiConvention.osgiManifest();
osgiManifest.setClassesDir(singleClassesDirectory);
osgiManifest.setClasspath(project.getConfigurations().getByName("runtime"));
jarTask.setManifest(osgiManifest);
}
});
}
use of org.gradle.api.tasks.Sync in project spring-boot by spring-projects.
the class BomExtension method effectiveBomArtifact.
public void effectiveBomArtifact() {
Configuration effectiveBomConfiguration = this.project.getConfigurations().create("effectiveBom");
this.project.getTasks().matching((task) -> task.getName().equals(DeployedPlugin.GENERATE_POM_TASK_NAME)).all((task) -> {
Sync syncBom = this.project.getTasks().create("syncBom", Sync.class);
syncBom.dependsOn(task);
File generatedBomDir = new File(this.project.getBuildDir(), "generated/bom");
syncBom.setDestinationDir(generatedBomDir);
syncBom.from(((GenerateMavenPom) task).getDestination(), (pom) -> pom.rename((name) -> "pom.xml"));
try {
String settingsXmlContent = FileCopyUtils.copyToString(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("effective-bom-settings.xml"), StandardCharsets.UTF_8)).replace("localRepositoryPath", new File(this.project.getBuildDir(), "local-m2-repository").getAbsolutePath());
syncBom.from(this.project.getResources().getText().fromString(settingsXmlContent), (settingsXml) -> settingsXml.rename((name) -> "settings.xml"));
} catch (IOException ex) {
throw new GradleException("Failed to prepare settings.xml", ex);
}
MavenExec generateEffectiveBom = this.project.getTasks().create("generateEffectiveBom", MavenExec.class);
generateEffectiveBom.setProjectDir(generatedBomDir);
File effectiveBom = new File(this.project.getBuildDir(), "generated/effective-bom/" + this.project.getName() + "-effective-bom.xml");
generateEffectiveBom.args("--settings", "settings.xml", "help:effective-pom", "-Doutput=" + effectiveBom);
generateEffectiveBom.dependsOn(syncBom);
generateEffectiveBom.getOutputs().file(effectiveBom);
generateEffectiveBom.doLast(new StripUnrepeatableOutputAction(effectiveBom));
this.project.getArtifacts().add(effectiveBomConfiguration.getName(), effectiveBom, (artifact) -> artifact.builtBy(generateEffectiveBom));
});
}
use of org.gradle.api.tasks.Sync in project gradle by gradle.
the class GradleUserManualPlugin method generateUserManual.
private void generateUserManual(Project project, TaskContainer tasks, ProjectLayout layout, GradleDocumentationExtension extension) {
tasks.withType(AsciidoctorTask.class).configureEach(task -> {
if (task.getName().equals("asciidoctor")) {
// ignore this task
task.setEnabled(false);
return;
}
task.outputOptions(options -> {
options.setSeparateOutputDirs(false);
options.setBackends(singletonList("html5"));
});
// TODO: Break the paths assumed here
TaskInputs inputs = task.getInputs();
inputs.files(extension.getCssFiles()).withPropertyName("manual").withPathSensitivity(PathSensitivity.RELATIVE);
inputs.dir("src/main/resources").withPropertyName("resources").withPathSensitivity(PathSensitivity.RELATIVE);
inputs.dir(extension.getUserManual().getSnippets()).withPropertyName("snippets").withPathSensitivity(PathSensitivity.RELATIVE);
inputs.dir(extension.getUserManual().getSamples()).withPropertyName("samples").withPathSensitivity(PathSensitivity.RELATIVE);
Provider<Directory> stylesDir = extension.getUserManual().getStagedDocumentation().dir("css");
inputs.dir(stylesDir).withPropertyName("stylesdir").withPathSensitivity(PathSensitivity.RELATIVE);
// TODO: Break the paths assumed here
Map<String, Object> attributes = new HashMap<>();
// TODO: This breaks the provider
attributes.put("stylesdir", stylesDir.get().getAsFile().getAbsolutePath());
attributes.put("stylesheet", "manual.css");
attributes.put("doctype", "book");
attributes.put("imagesdir", "img");
attributes.put("nofooter", true);
attributes.put("sectanchors", true);
attributes.put("sectlinks", true);
attributes.put("linkattrs", true);
attributes.put("reproducible", "");
attributes.put("docinfo", "");
attributes.put("lang", "en-US");
attributes.put("encoding", "utf-8");
attributes.put("idprefix", "");
attributes.put("website", "https://gradle.org");
// TODO: This breaks the provider
attributes.put("javaApi", extension.getJavadocs().getJavaApi().get().toString());
attributes.put("jdkDownloadUrl", "https://jdk.java.net/");
// TODO: This is coupled to extension.getJavadocs().getJavaApi()
attributes.put("javadocReferenceUrl", "https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html");
// TODO: This is coupled to extension.getJavadocs().getJavaApi()
attributes.put("minJdkVersion", "8");
attributes.put("antManual", "https://ant.apache.org/manual");
attributes.put("docsUrl", "https://docs.gradle.org");
// TODO: This breaks if the version is changed later.
attributes.put("gradleVersion", project.getVersion().toString());
attributes.put("snippetsPath", "snippets");
// Make sure the 'raw' location of the samples is available in all AsciidoctorTasks to access files with expected outputs in the 'tests' folder for inclusion in READMEs
attributes.put("samplesPath", extension.getUserManual().getStagingRoot().dir("raw/samples").get().getAsFile());
task.attributes(attributes);
});
TaskProvider<GenerateDocInfo> generateDocinfo = tasks.register("generateDocInfo", GenerateDocInfo.class, task -> {
task.getDocumentationFiles().from(extension.getUserManual().getRoot());
task.getDocumentationRoot().convention(extension.getUserManual().getRoot());
task.getDestinationDirectory().convention(layout.getBuildDirectory().dir("tmp/" + task.getName()));
});
TaskProvider<Sync> userguideFlattenSources = tasks.register("stageUserguideSource", Sync.class, task -> {
task.setDuplicatesStrategy(DuplicatesStrategy.FAIL);
// TODO: This doesn't allow adoc files to be generated?
task.from(extension.getUserManual().getRoot(), sub -> {
sub.include("**/*.adoc");
// Flatten adocs into a single directory
sub.eachFile(fcd -> fcd.setRelativePath(RelativePath.parse(true, fcd.getName())));
});
// From the snippets and the samples, filter out files generated if the build contained was ever executed
task.from(extension.getUserManual().getSnippets(), sub -> {
sub.into("snippets");
sub.exclude("**/.gradle/**");
sub.exclude("**/build/**");
sub.setIncludeEmptyDirs(false);
});
task.from(extension.getUserManual().getSamples(), sub -> {
sub.into("samples");
sub.exclude("**/*.adoc");
sub.exclude("**/.gradle/**");
sub.exclude("**/build/**");
sub.setIncludeEmptyDirs(false);
});
task.from(extension.getCssFiles(), sub -> sub.into("css"));
task.from(extension.getUserManual().getRoot().dir("img"), sub -> {
sub.include("**/*.png", "**/*.gif", "**/*.jpg", "**/*.svg");
sub.into("img");
});
task.from(extension.getUserManual().getResources());
task.from(generateDocinfo);
// TODO: This should be available on a Copy task.
DirectoryProperty flattenedAsciidocDirectory = project.getObjects().directoryProperty();
flattenedAsciidocDirectory.set(extension.getUserManual().getStagingRoot().dir("raw"));
task.getOutputs().dir(flattenedAsciidocDirectory);
task.getExtensions().getExtraProperties().set("destinationDirectory", flattenedAsciidocDirectory);
task.into(flattenedAsciidocDirectory);
});
TaskProvider<AsciidoctorTask> userguideSinglePageHtml = tasks.register("userguideSinglePageHtml", AsciidoctorTask.class, task -> {
task.setDescription("Generates HTML single-page user manual.");
configureForUserGuideSinglePage(task, extension, project);
task.outputOptions(options -> options.setBackends(singletonList("html5")));
// TODO: This breaks the provider
task.setOutputDir(extension.getUserManual().getStagingRoot().dir("render-single-html").get().getAsFile());
});
TaskProvider<AsciidoctorTask> userguideSinglePagePdf = tasks.register("userguideSinglePagePdf", AsciidoctorTask.class, task -> {
task.setDescription("Generates PDF single-page user manual.");
configureForUserGuideSinglePage(task, extension, project);
task.outputOptions(options -> options.setBackends(singletonList("pdf")));
// TODO: This breaks the provider
task.setOutputDir(extension.getUserManual().getStagingRoot().dir("render-single-pdf").get().getAsFile());
});
TaskProvider<AsciidoctorTask> userguideMultiPage = tasks.register("userguideMultiPage", AsciidoctorTask.class, task -> {
task.setGroup("documentation");
task.setDescription("Generates multi-page user manual.");
task.dependsOn(extension.getUserManual().getStagedDocumentation());
task.sources(patternSet -> {
patternSet.include("**/*.adoc");
patternSet.exclude("javaProject*Layout.adoc");
patternSet.exclude("userguide_single.adoc");
patternSet.exclude("snippets/**/*.adoc");
});
// TODO: This breaks the provider
task.setSourceDir(extension.getUserManual().getStagedDocumentation().get().getAsFile());
// TODO: This breaks the provider
task.setOutputDir(extension.getUserManual().getStagingRoot().dir("render-multi").get().getAsFile());
Map<String, Object> attributes = new HashMap<>();
attributes.put("icons", "font");
attributes.put("source-highlighter", "prettify");
attributes.put("toc", "auto");
attributes.put("toclevels", 1);
attributes.put("toc-title", "Contents");
attributes.put("groovyDslPath", "../dsl");
attributes.put("javadocPath", "../javadoc");
attributes.put("kotlinDslPath", "https://gradle.github.io/kotlin-dsl-docs/api");
// Used by SampleIncludeProcessor from `gradle/dotorg-docs`
// TODO: This breaks the provider
// TODO:
attributes.put("samples-dir", extension.getUserManual().getStagedDocumentation().get().getAsFile());
task.attributes(attributes);
});
// Avoid overlapping outputs by copying exactly what we want from other intermediate tasks
TaskProvider<Sync> userguide = tasks.register("userguide", Sync.class, task -> {
task.setGroup("documentation");
task.setDescription("Stages rendered user manual documentation.");
task.from(userguideSinglePageHtml);
task.from(userguideSinglePagePdf);
task.from(userguideMultiPage);
task.into(extension.getUserManual().getStagingRoot().dir("final"));
// TODO: Eliminate this duplication with the flatten task
task.from(extension.getUserManual().getRoot().dir("img"), sub -> {
sub.include("**/*.png", "**/*.gif", "**/*.jpg", "**/*.svg");
sub.into("img");
});
task.rename("userguide_single.pdf", "userguide.pdf");
});
extension.userManual(userManual -> {
userManual.getRoot().convention(extension.getSourceRoot().dir("userguide"));
userManual.getStagingRoot().convention(extension.getStagingRoot().dir("usermanual"));
// TODO: These should be generated too
userManual.getSnippets().convention(layout.getProjectDirectory().dir("src/snippets"));
userManual.getSamples().convention(layout.getProjectDirectory().dir("src/samples"));
userManual.getStagedDocumentation().convention(userguideFlattenSources.flatMap(task -> (DirectoryProperty) task.getExtensions().getExtraProperties().get("destinationDirectory")));
userManual.getRenderedDocumentation().from(userguide);
});
}
use of org.gradle.api.tasks.Sync in project gradle by gradle.
the class XCTestConventionPlugin method configureTestSuiteBuildingTasks.
private void configureTestSuiteBuildingTasks(final Project project, final DefaultSwiftXCTestBinary binary) {
// Overwrite the source to exclude `LinuxMain.swift`
SwiftCompile compile = binary.getCompileTask().get();
compile.getSource().setFrom(binary.getSwiftSource().getAsFileTree().matching(patterns -> patterns.include("**/*").exclude("**/LinuxMain.swift")));
if (binary instanceof SwiftXCTestBundle) {
TaskContainer tasks = project.getTasks();
final Names names = binary.getNames();
// TODO - creating a bundle should be done by some general purpose plugin
// TODO - make this lazy
final DefaultNativePlatform currentPlatform = new DefaultNativePlatform("current");
final ModelRegistry modelRegistry = ((ProjectInternal) project).getModelRegistry();
final NativeToolChain toolChain = modelRegistry.realize("toolChains", NativeToolChainRegistryInternal.class).getForPlatform(currentPlatform);
// Platform specific arguments
// TODO: Need to lazily configure compile task
// TODO: Ultimately, this should be some kind of 3rd party dependency that's visible to dependency management.
compile.getCompilerArgs().addAll(project.provider(() -> {
File platformSdkPath = sdkPlatformPathLocator.find();
File frameworkDir = new File(platformSdkPath, "Developer/Library/Frameworks");
// Since Xcode 11/12, the XCTest framework is being replaced by a different library that's available in the sdk root
File extraInclude = new File(platformSdkPath, "Developer/usr/lib");
return Arrays.asList("-parse-as-library", "-F" + frameworkDir.getAbsolutePath(), "-I", extraInclude.getAbsolutePath(), "-v");
}));
// Add a link task
final TaskProvider<LinkMachOBundle> link = tasks.register(names.getTaskName("link"), LinkMachOBundle.class, task -> {
task.getLinkerArgs().set(project.provider(() -> {
File platformSdkPath = sdkPlatformPathLocator.find();
File frameworkDir = new File(platformSdkPath, "Developer/Library/Frameworks");
// Since Xcode 11/12, the XCTest framework is being replaced by a different library that's available in the sdk root
File extraInclude = new File(platformSdkPath, "Developer/usr/lib");
return Lists.newArrayList("-F" + frameworkDir.getAbsolutePath(), "-L", extraInclude.getAbsolutePath(), "-framework", "XCTest", "-Xlinker", "-rpath", "-Xlinker", "@executable_path/../Frameworks", "-Xlinker", "-rpath", "-Xlinker", "@loader_path/../Frameworks");
}));
task.source(binary.getObjects());
task.lib(binary.getLinkLibraries());
final PlatformToolProvider toolProvider = ((NativeToolChainInternal) toolChain).select(currentPlatform);
Provider<RegularFile> exeLocation = project.getLayout().getBuildDirectory().file(binary.getBaseName().map(baseName -> toolProvider.getExecutableName("exe/" + names.getDirName() + baseName)));
task.getLinkedFile().set(exeLocation);
task.getTargetPlatform().set(currentPlatform);
task.getToolChain().set(toolChain);
task.getDebuggable().set(binary.isDebuggable());
});
final TaskProvider<InstallXCTestBundle> install = tasks.register(names.getTaskName("install"), InstallXCTestBundle.class, task -> {
task.getBundleBinaryFile().set(link.get().getLinkedFile());
task.getInstallDirectory().set(project.getLayout().getBuildDirectory().dir("install/" + names.getDirName()));
});
binary.getInstallDirectory().set(install.flatMap(task -> task.getInstallDirectory()));
binary.getExecutableFile().set(link.flatMap(task -> task.getLinkedFile()));
DefaultSwiftXCTestBundle bundle = (DefaultSwiftXCTestBundle) binary;
bundle.getLinkTask().set(link);
bundle.getRunScriptFile().set(install.flatMap(task -> task.getRunScriptFile()));
} else {
DefaultSwiftXCTestExecutable executable = (DefaultSwiftXCTestExecutable) binary;
executable.getRunScriptFile().set(executable.getInstallTask().flatMap(task -> task.getRunScriptFile()));
// Rename `LinuxMain.swift` to `main.swift` so the entry point is correctly detected by swiftc
if (binary.getTargetMachine().getOperatingSystemFamily().isLinux()) {
TaskProvider<Sync> renameLinuxMainTask = project.getTasks().register("renameLinuxMain", Sync.class, task -> {
task.from(binary.getSwiftSource());
task.into(project.provider(() -> task.getTemporaryDir()));
task.include("LinuxMain.swift");
task.rename(it -> "main.swift");
});
compile.getSource().from(project.files(renameLinuxMainTask).getAsFileTree().matching(patterns -> patterns.include("**/*.swift")));
}
}
}
Aggregations