jib
jib copied to clipboard
Collect all output of a Gradle's SourceSetOutput.getDirs()
Environment:
- *Jib version: 3.2.1
- Build tool: Gradle 7.4.0
- OS: Windows
Description of the issue: A gradle sourceSet has a common output as sourceSets.main.output When an additional output directory is registered to the main source set then it should be part of the created image.
Expected behavior: the contents of $buildDir/generated/extraResources/ to be added to the jib image.
Steps to reproduce:
def generatorTask = tasks.register("generateExtraResources") {
outputs.dir("$buildDir/generated/extraResources")
doLast {
file("$buildDir/generated/extraResources/some-file.properties").write "Hello"
}
}
// the directory "$buildDir/generated/extraResources" is now registered as part of the output of the sourceset and would be added to the jar of a java project.
sourceSets.main.output.dir(generatorTask)
Log output:
Additional Information:
The issue seems to be the code here: https://github.com/GoogleContainerTools/jib/blob/86a3c855cb302da7671356dad7d2559fe3f138f5/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java#L223
// current code
SourceSet mainSourceSet = getMainSourceSet();
FileCollection classesOutputDirectories =
mainSourceSet.getOutput().getClassesDirs().filter(File::exists);
Path resourcesOutputDirectory = mainSourceSet.getOutput().getResourcesDir().toPath();
FileCollection allFiles =
project.getConfigurations().getByName(configurationName).filter(File::exists);
...
switch (containerizingMode) {
case EXPLODED:
// Adds resource files
if (Files.exists(resourcesOutputDirectory)) {
javaContainerBuilder.addResources(resourcesOutputDirectory);
}
...
// perhaps better approach
SourceSet mainSourceSet = getMainSourceSet();
FileCollection classesOutputDirectories =
mainSourceSet.getOutput().getClassesDirs().filter(File::exists);
FileCollection resourcesOutputDirectories = mainSourceSet.getOutput().minus(mainSourceSet.getClassesDirs()).filter(File::exists);
...
switch (containerizingMode) {
case EXPLODED:
// Adds resource files
for (File resourcesOutputDirectory: resourcesOutputDirectories) {
javaContainerBuilder.addResources(resourcesOutputDirectory.toPath());
}
...
mainSourceSet.getOutput() is a fileCollection by itself so the split is only relevant to get the two separate directories classes and resources in the image.
Hi @jutoft, thanks for raising this issue. It does look like a valid approach, we'll consider this as a feature request and discuss about it. For now, the workaround you can set your eyes on is configuring jib.extraDirectories to copy additional output directory generated.
Yes thank you.
I have added the directory using extraDirectories as a workaround. The build dependency is uphold as the folder does get the right dependency "hooks".
So yes this is a feature request :)
Thanks, will look into this!