From d34b8e0f4db84f1571785592b523e675a1b2f960 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 26 Apr 2023 17:58:36 +0200 Subject: build: improve Xtext project isolation * Avoid writing generated source files directly into sibling projects. * Full project isolation cannot be enabled yet, because the frontend plugin still requires cross-projects task dependencies for Node.js installation. --- subprojects/frontend/build.gradle.kts | 8 ++-- subprojects/language-ide/build.gradle.kts | 8 +--- subprojects/language-model/build.gradle.kts | 4 ++ subprojects/language-web/build.gradle.kts | 11 +---- subprojects/language/build.gradle.kts | 56 ++++++++++++++++------ .../tools/refinery/language/GenerateProblem.mwe2 | 14 +++++- 6 files changed, 66 insertions(+), 35 deletions(-) (limited to 'subprojects') diff --git a/subprojects/frontend/build.gradle.kts b/subprojects/frontend/build.gradle.kts index 9fd99742..d0839371 100644 --- a/subprojects/frontend/build.gradle.kts +++ b/subprojects/frontend/build.gradle.kts @@ -29,9 +29,9 @@ val sourcesWithoutTypes = fileTree("src") { exclude("**/*.typegen.ts") } -val sourcesWithTypes = fileTree("src") + fileTree("types") +val sourcesWithTypes: FileCollection = fileTree("src") + fileTree("types") -val buildScripts = fileTree("config") + files( +val buildScripts: FileCollection = fileTree("config") + files( ".eslintrc.cjs", "prettier.config.cjs", "vite.config.ts", @@ -43,7 +43,7 @@ val installationState = files( "package.json", ) -val sharedConfigFiles = installationState + files( +val sharedConfigFiles: FileCollection = installationState + files( "tsconfig.json", "tsconfig.base.json", "tsconfig.node.json", @@ -58,7 +58,7 @@ val assembleSources = sourcesWithTypes + fileTree("public") + file("index.html") val assembleFiles = assembleSources + assembleConfigFiles -val lintingFiles = sourcesWithTypes + buildScripts + sharedConfigFiles +val lintingFiles: FileCollection = sourcesWithTypes + buildScripts + sharedConfigFiles tasks { val generateXStateTypes by registering(RunYarn::class) { diff --git a/subprojects/language-ide/build.gradle.kts b/subprojects/language-ide/build.gradle.kts index ff8630f9..1259cd67 100644 --- a/subprojects/language-ide/build.gradle.kts +++ b/subprojects/language-ide/build.gradle.kts @@ -13,12 +13,6 @@ dependencies { api(project(":refinery-language")) api(libs.xtext.ide) api(libs.xtext.xbase.ide) + xtextGenerated(project(":refinery-language", "generatedIdeSources")) } -val generateXtextLanguage by project(":refinery-language").tasks.existing - -for (taskName in listOf("compileJava", "processResources")) { - tasks.named(taskName) { - dependsOn(generateXtextLanguage) - } -} diff --git a/subprojects/language-model/build.gradle.kts b/subprojects/language-model/build.gradle.kts index 4f15e5e6..59ff9046 100644 --- a/subprojects/language-model/build.gradle.kts +++ b/subprojects/language-model/build.gradle.kts @@ -35,6 +35,10 @@ tasks { inputs.file("src/main/java/tools/refinery/language/model/GenerateProblemModel.mwe2") inputs.file("src/main/resources/model/problem.ecore") inputs.file("src/main/resources/model/problem.genmodel") + outputs.file("build.properties") + outputs.file("META-INF/MANIFEST.MF") + outputs.file("plugin.xml") + outputs.file("plugin.properties") outputs.dir("src/main/emf-gen") args("src/main/java/tools/refinery/language/model/GenerateProblemModel.mwe2", "-p", "rootPath=/$projectDir") } diff --git a/subprojects/language-web/build.gradle.kts b/subprojects/language-web/build.gradle.kts index d398e002..7a7adac0 100644 --- a/subprojects/language-web/build.gradle.kts +++ b/subprojects/language-web/build.gradle.kts @@ -22,7 +22,8 @@ dependencies { implementation(libs.jetty.websocket.server) implementation(libs.slf4j.api) implementation(libs.xtext.web) - webapp(project(path = ":refinery-frontend", configuration = "productionAssets")) + xtextGenerated(project(":refinery-language", "generatedWebSources")) + webapp(project(":refinery-frontend", "productionAssets")) testImplementation(testFixtures(project(":refinery-language"))) testImplementation(libs.jetty.websocket.client) } @@ -32,14 +33,6 @@ application { } tasks { - val generateXtextLanguage by project(":refinery-language").tasks.existing - - for (taskName in listOf("compileJava", "processResources")) { - named(taskName) { - dependsOn(generateXtextLanguage) - } - } - jar { dependsOn(webapp) from(webapp) { diff --git a/subprojects/language/build.gradle.kts b/subprojects/language/build.gradle.kts index aa799c3b..bac1e586 100644 --- a/subprojects/language/build.gradle.kts +++ b/subprojects/language/build.gradle.kts @@ -14,6 +14,16 @@ plugins { id("tools.refinery.gradle.xtext-generated") } +val generatedIdeSources: Configuration by configurations.creating { + isCanBeConsumed = true + isCanBeResolved = false +} + +val generatedWebSources: Configuration by configurations.creating { + isCanBeConsumed = true + isCanBeResolved = false +} + dependencies { api(platform(libs.xtext.bom)) api(libs.ecore) @@ -32,6 +42,20 @@ sourceSets { } } +val generateXtextLanguage by tasks.registering(JavaExec::class) { + mainClass.set("org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher") + classpath(configurations.mwe2) + inputs.file("src/main/java/tools/refinery/language/GenerateProblem.mwe2") + inputs.file("src/main/java/tools/refinery/language/Problem.xtext") + inputs.file("../language-model/src/main/resources/model/problem.ecore") + inputs.file("../language-model/src/main/resources/model/problem.genmodel") + outputs.dir("src/main/xtext-gen") + outputs.dir("src/testFixtures/xtext-gen") + outputs.dir("$buildDir/generated/sources/xtext/ide") + outputs.dir("$buildDir/generated/sources/xtext/web") + args("src/main/java/tools/refinery/language/GenerateProblem.mwe2", "-p", "rootPath=/$projectDir/..") +} + tasks { jar { from(sourceSets.main.map { it.allSource }) { @@ -39,20 +63,16 @@ tasks { } } - val generateXtextLanguage by registering(JavaExec::class) { - mainClass.set("org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher") - classpath(configurations.mwe2) - inputs.file("src/main/java/tools/refinery/language/GenerateProblem.mwe2") - inputs.file("src/main/java/tools/refinery/language/Problem.xtext") - outputs.dir("src/main/xtext-gen") - outputs.dir("src/testFixtures/xtext-gen") - outputs.dir("../language-ide/src/main/xtext-gen") - outputs.dir("../language-web/src/main/xtext-gen") - args("src/main/java/tools/refinery/language/GenerateProblem.mwe2", "-p", "rootPath=/$projectDir/..") + syncXtextGeneratedSources { + // We generate Xtext runtime sources directly to {@code src/main/xtext-gen}, so there is no need to copy them + // from an artifact. We expose the {@code generatedIdeSources} and {@code generatedWebSources} artifacts to + // sibling IDE and web projects which can use this task to consume them and copy the appropriate sources to + // their own {@code src/main/xtext-gen} directory. + enabled = false } - for (taskName in listOf("compileJava", "processResources", "processTestFixturesResources", - "generateEclipseSourceFolders")) { + for (taskName in listOf("compileJava", "processResources", "compileTestFixturesJava", + "processTestFixturesResources", "generateEclipseSourceFolders")) { named(taskName) { dependsOn(generateXtextLanguage) } @@ -61,8 +81,16 @@ tasks { clean { delete("src/main/xtext-gen") delete("src/testFixtures/xtext-gen") - delete("../language-ide/src/main/xtext-gen") - delete("../language-web/src/main/xtext-gen") + } +} + +artifacts { + add(generatedIdeSources.name, file("$buildDir/generated/sources/xtext/ide")) { + builtBy(generateXtextLanguage) + } + + add(generatedWebSources.name, file("$buildDir/generated/sources/xtext/web")) { + builtBy(generateXtextLanguage) } } diff --git a/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 b/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 index d8d89173..59eba8f7 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 +++ b/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 @@ -16,16 +16,28 @@ Workflow { project = StandardProjectConfig { baseName = 'language' rootPath = rootPath + runtime = { + // Do not generate new files into src/main/java + src = null + } runtimeTest = { enabled = true - srcGen = 'src/testFixtures/xtext-gen' + // Only generate the xtext-gen files and leave the rest of the project alone + root = null + srcGen = '${rootPath}/language/src/testFixtures/xtext-gen' } genericIde = { name = 'language-ide' + // Only generate the xtext-gen files and leave the rest of the project alone + root = null + srcGen = "${rootPath}/language/build/generated/sources/xtext/ide" } web = { enabled = true name = 'language-web' + // Only generate the xtext-gen files and leave the rest of the project alone + root = null + srcGen = "${rootPath}/language/build/generated/sources/xtext/web" } mavenLayout = true } -- cgit v1.2.3-54-g00ecf