build.gradle.kts (200 lines of code) (raw):

import com.jetbrains.plugin.structure.base.utils.isFile import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.jetbrains.changelog.exceptions.MissingVersionException import org.jetbrains.intellij.platform.gradle.Constants import org.jetbrains.intellij.platform.gradle.TestFrameworkType import org.jetbrains.intellij.platform.gradle.tasks.PrepareSandboxTask import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import kotlin.io.path.absolute import kotlin.io.path.isDirectory plugins { alias(libs.plugins.changelog) alias(libs.plugins.gradleIntelliJPlatform) alias(libs.plugins.gradleJvmWrapper) alias(libs.plugins.kotlinJvm) id("java") } allprojects { repositories { maven("https://cache-redirector.jetbrains.com/intellij-dependencies") mavenCentral() } } repositories { intellijPlatform { defaultRepositories() jetbrainsRuntime() } } val pluginVersion: String by project val untilBuildVersion: String by project val buildConfiguration: String by project val dotNetPluginId: String by project val dotNetSrcDir = File(projectDir, "src/dotnet") version = pluginVersion val riderSdkPath by lazy { val path = intellijPlatform.platformPath.resolve("lib/DotNetSdkForRdPlugins").absolute() if (!path.isDirectory()) error("$path does not exist or not a directory") println("Rider SDK path: $path") return@lazy path } dependencies { intellijPlatform { with(file("build/rider")) { when { exists() -> { logger.lifecycle("*** Using Rider SDK from local path $this") local(this) } else -> { logger.lifecycle("*** Using Rider SDK from intellij-snapshots repository") rider(libs.versions.riderSdk, useInstaller = false) } } } jetbrainsRuntime() testFramework(TestFrameworkType.Bundled) } } intellijPlatform { this.instrumentCode = false this.buildSearchableOptions = false } kotlin { jvmToolchain { languageVersion = JavaLanguageVersion.of(17) } } sourceSets { main { kotlin.srcDir("src/rider/generated/kotlin") kotlin.srcDir("src/rider/main/kotlin") resources.srcDir("src/rider/main/resources") } } tasks { val generateDotNetSdkProperties by registering { val dotNetSdkGeneratedPropsFile = File(projectDir, "build/DotNetSdkPath.Generated.props") doLast { dotNetSdkGeneratedPropsFile.writeTextIfChanged("""<Project> <PropertyGroup> <DotNetSdkPath>$riderSdkPath</DotNetSdkPath> </PropertyGroup> </Project> """) } } val generateNuGetConfig by registering { val nuGetConfigFile = File(dotNetSrcDir, "nuget.config") doLast { nuGetConfigFile.writeTextIfChanged(""" <?xml version="1.0" encoding="utf-8"?> <!-- Auto-generated from 'generateNuGetConfig' task of old.build_gradle.kts --> <!-- Run `gradlew :prepare` to regenerate --> <configuration> <packageSources> <add key="rider-sdk" value="$riderSdkPath" /> </packageSources> </configuration> """.trimIndent()) } } val rdGen = ":protocol:rdgen" register("prepare") { dependsOn(rdGen, generateDotNetSdkProperties, generateNuGetConfig) } val compileDotNet by registering { dependsOn(rdGen, generateDotNetSdkProperties, generateNuGetConfig) doLast { exec { executable(layout.projectDirectory.file("dotnet.cmd")) args("build", "-consoleLoggerParameters:ErrorsOnly", "--configuration", buildConfiguration) } } } withType<KotlinCompile> { dependsOn(rdGen) } buildPlugin { dependsOn(compileDotNet) } patchPluginXml { untilBuild.set(untilBuildVersion) val latestChangelog = try { changelog.getUnreleased() } catch (_: MissingVersionException) { changelog.getLatest() } changeNotes.set(provider { changelog.renderItem( latestChangelog .withHeader(false) .withEmptySections(false), org.jetbrains.changelog.Changelog.OutputType.HTML ) }) } withType<PrepareSandboxTask> { dependsOn(compileDotNet) val outputFolder = file("$dotNetSrcDir/$dotNetPluginId/bin/${dotNetPluginId}/$buildConfiguration") val pluginFiles = listOf( "$outputFolder/${dotNetPluginId}.dll", "$outputFolder/${dotNetPluginId}.pdb" ) from(pluginFiles) { into("${rootProject.name}/dotnet") } doLast { for (f in pluginFiles) { val file = file(f) if (!file.exists()) throw RuntimeException("File \"$file\" does not exist.") } } } withType<Test> { classpath -= classpath.filter { (it.name.startsWith("localization-") && it.name.endsWith(".jar")) // TODO: https://youtrack.jetbrains.com/issue/IJPL-178084/External-plugin-tests-break-due-to-localization-issues || it.name == "cwm-plugin.jar" // TODO: Check after 251 EAP5 release } useTestNG() testLogging { showStandardStreams = true exceptionFormat = TestExceptionFormat.FULL } environment["LOCAL_ENV_RUN"] = "true" } val testRiderPreview by intellijPlatformTesting.testIde.registering { version = libs.versions.riderSdkPreview useInstaller = false task { enabled = libs.versions.riderSdk.get() != libs.versions.riderSdkPreview.get() } } check { dependsOn(testRiderPreview.name) } runIde { jvmArgs("-Xmx1500m") } } val riderModel: Configuration by configurations.creating { isCanBeConsumed = true isCanBeResolved = false } artifacts { add(riderModel.name, provider { intellijPlatform.platformPath.resolve("lib/rd/rider-model.jar").also { check(it.isFile) { "rider-model.jar is not found at $riderModel" } } }) { builtBy(Constants.Tasks.INITIALIZE_INTELLIJ_PLATFORM_PLUGIN) } } fun File.writeTextIfChanged(content: String) { val bytes = content.toByteArray() if (!exists() || !readBytes().contentEquals(bytes)) { println("Writing $path") parentFile.mkdirs() writeBytes(bytes) } }