Skip to content

Commit

Permalink
Fix broken distribution (#13740)
Browse files Browse the repository at this point in the history
* build: Fix broken distribution zip

* build: Include all necessary libs in distribution

* build: Exclude `grails-bom` and `grails-dependencies` artifacts from distribution

---------

Co-authored-by: James Fredley <[email protected]>
  • Loading branch information
matrei and jamesfredley authored Oct 16, 2024
1 parent ab1b7e9 commit 76fd75a
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 96 deletions.
57 changes: 30 additions & 27 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -121,23 +121,19 @@ ext {
nexusUsername = System.getenv("SONATYPE_USERNAME") ?: project.hasProperty("sonatypeOssUsername") ? project.sonatypeOssUsername : ''
nexusPassword = System.getenv("SONATYPE_PASSWORD") ?: project.hasProperty("sonatypeOssPassword") ? project.sonatypeOssPassword : ''


// Directories created during the build which are related
// to turning the workspace root into a GRAILS_HOME
distInstallDir = layout.buildDirectory.dir('dist-tmp')
homeDistDir = layout.projectDirectory.dir('dist')
homeBinDir = layout.projectDirectory.dir('bin')
homeConfDir = layout.projectDirectory.dir('conf')
homeLibDir = layout.projectDirectory.dir('lib')
homeSrcDir = layout.projectDirectory.dir('src')
}

version = grailsVersion
group = "org.grails"

// directories created during the build which are related
// to turning the workspace root into a GRAILS_HOME
ext {
distInstallDir = layout.buildDirectory.dir("dist-tmp").get()
homeDistDir = layout.buildDirectory.dir("install/dist").get()
homeBinDir = layout.buildDirectory.dir("install/bin").get()
homeConfDir = layout.buildDirectory.dir("install/conf").get()
homeLibDir = layout.buildDirectory.dir("install/lib").get()
homeSrcDir = layout.buildDirectory.dir("install/src").get()
}

// Groovy is added as a dependency to both the 'groovy' and 'compile'
// configurations, so place the dependency in a shared variable. The
// 'compile' is required so that Groovy appears as a dependency in the
Expand Down Expand Up @@ -392,21 +388,6 @@ subprojects { project ->
tasks.withType(io.github.gradlenexus.publishplugin.InitializeNexusStagingRepository).configureEach {
shouldRunAfter(tasks.withType(Sign))
}

tasks.register("installToHomeDist", Copy) {
dependsOn sourcesJar, javadocJar, jar
from layout.buildDirectory.dir("libs").get()
into distInstallDir
}

tasks.withType(PublishToMavenLocal).configureEach {
dependsOn installToHomeDist
doLast {
ant.copy(todir: homeDistDir, flatten: true, includeEmptyDirs: false) {
fileset dir: distInstallDir
}
}
}
}

if (project.name == 'grails-dependencies') return
Expand Down Expand Up @@ -587,6 +568,28 @@ subprojects { project ->
languageVersion = JavaLanguageVersion.of(17)
}
}

if (!isTestSuite) {
tasks.register('installToHomeDist', Copy) {
dependsOn 'jar', 'sourcesJar', 'javadocJar'
from layout.buildDirectory.dir('libs')
into distInstallDir
}

tasks.withType(PublishToMavenLocal).configureEach {
dependsOn 'installToHomeDist'
doLast {
ant.copy(todir: homeDistDir.asFile, flatten: true, includeEmptyDirs: false) {
fileset dir: distInstallDir.get().asFile
}
}
}
}
}

tasks.register('clean', Delete) {
group = 'build'
delete layout.buildDirectory, homeBinDir, homeConfDir, homeDistDir, homeLibDir, homeSrcDir
}

// From this point on we need the subprojects to be fully configured, so force their full evaluation
Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ gradleNexusPluginVersion=2.3.1
gradleNexusPublishPluginVersion=1.3.0
gradleExtraConfigurationsPluginVersion=10.0.1
gradleLicensePluginVersion=0.16.1
gradleToolingApiVersion=8.10.2
grailsGradlePluginVersion=7.0.0-SNAPSHOT
groovyVersion=4.0.23
gspVersion=7.0.0-SNAPSHOT
Expand Down
136 changes: 71 additions & 65 deletions gradle/assemble.gradle
Original file line number Diff line number Diff line change
@@ -1,38 +1,35 @@
apply plugin: org.grails.gradle.GrailsBuildPlugin
import org.gradle.api.internal.plugins.StartScriptGenerator
import org.gradle.api.internal.plugins.UnixStartScriptGenerator
import org.gradle.api.internal.plugins.WindowsStartScriptGenerator
import org.grails.gradle.GrailsBuildPlugin

def libsConfigurations = []
apply plugin: GrailsBuildPlugin

List<Configuration> libsConfigurations = []
subprojects { subproject ->
if(subproject.name == 'grails-dependencies') return
if(subproject.name == 'grails-bom') return
if(subproject.name == 'grails-core') {

configurations {
libsConfigurations << libs {
extendsFrom compileClasspath, runtimeClasspath
["jsp21", "uaa"].collect { configurations.findByName(it) }.findAll { it != null }.each { extendsFrom it }
}
if (subproject.name in ['grails-shell', 'grails-core']) {
libsConfigurations << configurations.create("${subproject.name}-libs") {
extendsFrom configurations.compileClasspath, configurations.runtimeClasspath
}
}
}

task configurePopulateDependencies {
ext {
baseCachesDir = "$gradle.gradleUserHomeDir/caches"
cacheDir = "$baseCachesDir/modules-2"
metadata = "$cacheDir/metadata-2.1/descriptors"
}
tasks.register('configurePopulateDependencies') {
ext.set('baseCachesDir', "$gradle.gradleUserHomeDir/caches")
ext.set('cacheDir', "$baseCachesDir/modules-2")
ext.set('metadata', "$cacheDir/metadata-2.1/descriptors")
doLast {
def projectNames = rootProject.subprojects*.name

def seen = []
libsConfigurations.each { configuration ->
def sourceArtifacts = sourcesFor(configuration).resolvedConfiguration.lenientConfiguration.getArtifacts(Specs.satisfyAll()).groupBy {
configuration.exclude(group: 'org.codehaus.groovy')
def sourceArtifacts = sourcesFor(configuration).resolvedConfiguration.lenientConfiguration.artifacts.groupBy {
it.moduleVersion.id
}
def javadocArtifacts = javadocFor(configuration).resolvedConfiguration.lenientConfiguration.getArtifacts(Specs.satisfyAll()).groupBy {
def javadocArtifacts = javadocFor(configuration).resolvedConfiguration.lenientConfiguration.artifacts.groupBy {
it.moduleVersion.id
}
def pomArtifacts = pomFor(configuration).resolvedConfiguration.lenientConfiguration.getArtifacts(Specs.satisfyAll()).groupBy {
def pomArtifacts = pomFor(configuration).resolvedConfiguration.lenientConfiguration.artifacts.groupBy {
it.moduleVersion.id
}

Expand Down Expand Up @@ -82,67 +79,75 @@ task configurePopulateDependencies {
}
}

task populateDependencies(type: Sync, dependsOn: configurePopulateDependencies) {
tasks.register('populateDependencies', Sync) {
dependsOn 'configurePopulateDependencies'
into homeLibDir
includeEmptyDirs = false
duplicatesStrategy = DuplicatesStrategy.INCLUDE
}

// Can't use sync task here because this directory contains other things as well.
task sourcesJars(type: Sync) {
tasks.register('sourcesJars', Sync) {
into homeSrcDir
from subprojects
.findAll { subproject -> !subproject.name.startsWith('grails-test-suite') &&
!subproject.name.startsWith('grails-dependencies') &&
!subproject.name.startsWith('grails-bom')
}.sourcesJar*.outputs*.files
from rootProject.subprojects.findAll { subproject ->
!subproject.name.startsWith('grails-test-suite') &&
!subproject.name.startsWith('grails-dependencies') &&
!subproject.name.startsWith('grails-bom')
}.sourcesJar*.outputs*.files
// sourcesFor comes from GrailsBuildPlugin
from { sourcesFor(libsConfigurations*.copyRecursive { it.name.startsWith('grails-datastore') }.collect { it.transitive = false; it }) }
from {
sourcesFor(
libsConfigurations*.copyRecursive { it.name.startsWith('grails-datastore') }.collect { it.transitive = false; it }
)
}
}

task grailsCreateStartScripts(type: GrailsCreateStartScripts) {
description = "Creates OS specific scripts to run grails-shell as a JVM application."
mainClass.set('org.grails.cli.GrailsCli')
tasks.register('grailsCreateStartScripts', GrailsCreateStartScripts) {
description = 'Creates OS specific scripts to run grails-shell as a JVM application.'
mainClass = 'org.grails.cli.GrailsCli'
applicationName = 'grails'
defaultJvmOpts = ["-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-XX:CICompilerCount=3"]
outputDir = file('bin')
defaultJvmOpts = ['-XX:+TieredCompilation', '-XX:TieredStopAtLevel=1', '-XX:CICompilerCount=3']
outputDir = rootProject.layout.projectDirectory.dir('bin').asFile
classpath = rootProject.childProjects['grails-shell'].configurations.runtimeClasspath
projectArtifacts = rootProject.childProjects['grails-shell'].tasks['jar'].outputs.files.collect { "dist/${it.name}" }
projectArtifacts = rootProject.childProjects['grails-shell'].tasks.named('jar').get().outputs.files.collect { "dist/${it.name}" } as List<String>
doLast {
ant.replace(file: file('bin/grails'), token: 'media/gradle.icns', value: 'media/icons/grails.icns')
ant.chmod(file: file('bin/grails'), perm: 'ugo+rx')
ant.replace(file: rootProject.layout.projectDirectory.file('bin/grails').asFile, token: 'media/gradle.icns', value: 'media/icons/grails.icns')
ant.chmod(file: rootProject.layout.projectDirectory.file('bin/grails').asFile, perm: 'ugo+rx')
}
}

class GrailsCreateStartScripts extends org.gradle.api.tasks.application.CreateStartScripts {
class GrailsCreateStartScripts extends CreateStartScripts {

@Input
Collection<String> projectArtifacts=[]
Collection<String> projectArtifacts = []

@org.gradle.api.tasks.TaskAction
@TaskAction
void generate() {
def generator = new org.gradle.api.internal.plugins.StartScriptGenerator()
generator.unixStartScriptGenerator.template = project.rootProject.childProjects['grails-shell'].resources.text.fromFile('src/main/resources/unixStartScript.txt')
generator.applicationName = getApplicationName()
generator.mainClassName = getMainClassName()
generator.defaultJvmOpts = getDefaultJvmOpts()
generator.optsEnvironmentVar = getOptsEnvironmentVar()
generator.exitEnvironmentVar = getExitEnvironmentVar()
Project grailsShellProject = project.rootProject.childProjects['grails-shell']
def unixStartScriptGenerator = new UnixStartScriptGenerator()
unixStartScriptGenerator.template = grailsShellProject.resources.text.fromFile('src/main/resources/unixStartScript.txt')
def generator = new StartScriptGenerator(unixStartScriptGenerator, new WindowsStartScriptGenerator())
generator.applicationName = applicationName
generator.mainClassName = mainClass.get()
generator.defaultJvmOpts = defaultJvmOpts
generator.optsEnvironmentVar = optsEnvironmentVar
generator.exitEnvironmentVar = exitEnvironmentVar
generator.classpath = projectArtifacts + getClasspath().resolvedConfiguration.resolvedArtifacts.collect { artifact ->
def dependency = artifact.moduleVersion.id
String installedFile = "lib/$dependency.group/$dependency.name/jars/$artifact.file.name"
if(dependency.group=='org.grails' && !project.file(installedFile).exists()) {
if(dependency.group == 'org.grails' && !project.file(installedFile).exists()) {
installedFile = "dist/$artifact.file.name"
}
installedFile
}
generator.scriptRelPath = "bin/${getUnixScript().name}"
generator.generateUnixScript(getUnixScript())
generator.generateWindowsScript(getWindowsScript())
generator.scriptRelPath = "bin/${unixScript.name}"
generator.generateUnixScript(unixScript)
generator.generateWindowsScript(windowsScript)
}
}

task install(dependsOn: [populateDependencies, grailsCreateStartScripts]) { task ->
tasks.register('install') { task ->
dependsOn 'populateDependencies', 'grailsCreateStartScripts'
subprojects { Project project ->
if(!project.name.startsWith('grails-test-suite')) {
task.dependsOn("$project.name:publishToMavenLocal")
Expand All @@ -152,29 +157,30 @@ task install(dependsOn: [populateDependencies, grailsCreateStartScripts]) { task
//task install(dependsOn: [populateDependencies, grailsCreateStartScripts] + subprojects.findAll { !it.name.startsWith('grails-test-suite') }
// *.collect { Project p -> p.tasks.withType(PublishToMavenLocal)})

task zipDist(type: Zip, dependsOn: [sourcesJars, install]) {
destinationDirectory = project.layout.buildDirectory.dir("distributions")
tasks.register('zipDist', Zip) {
dependsOn 'sourcesJars', 'install'
destinationDirectory = rootProject.layout.buildDirectory.dir('distributions')
archiveBaseName = 'grails'
archiveAppendix = grailsVersion

exclude "**/CVS/**"
exclude '**/CVS/**'

into("grails-$grailsVersion") {
from(projectDir) {
include 'lib/', 'media/', 'samples/', 'scripts/', 'LICENSE', 'INSTALL', "src/"
from(rootProject.layout.projectDirectory) {
// Some of these are probably not needed as they are not present in the project folder
include 'bin/grails', 'bin/grails.bat', 'lib/', 'media/', 'samples/', 'scripts/', 'LICENSE', 'INSTALL', 'src/'
exclude 'ant/bin', 'src/grails', 'src/war'
}
from(project.layout.buildDirectory.dir("docs").get().asFile) {
into "doc"
}
from("conf") {
into "conf"
from(tasks.docs) {
into 'doc'
}
from(homeDistDir) {
into "dist"
exclude "*.zip"
into 'dist'
exclude '*.zip'
}
}
}

task assemble(dependsOn: zipDist)
tasks.register('assemble') {
dependsOn 'zipDist'
}
8 changes: 4 additions & 4 deletions grails-shell/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ mainClassName = "org.grails.cli.GrailsCli"

repositories {
mavenCentral()
}

ext {
gradleToolingApiVersion = '7.3-20210825160000+0000'
maven {
url = 'https://repo.gradle.org/gradle/libs-releases'
description = 'Needed for Gradle Tooling API'
}
}

dependencies {
Expand Down

0 comments on commit 76fd75a

Please sign in to comment.