|
| 1 | +package build |
| 2 | + |
| 3 | +import build.util.makeDirs |
| 4 | +import build.util.makeTaskName |
| 5 | +import build.util.writeJson |
| 6 | +import org.gradle.api.Project |
| 7 | +import org.gradle.api.Task |
| 8 | +import org.gradle.api.tasks.Copy |
| 9 | +import org.gradle.kotlin.dsl.get |
| 10 | +import org.gradle.kotlin.dsl.register |
| 11 | +import java.io.File |
| 12 | + |
| 13 | +class InstallTasksConfigurator( |
| 14 | + private val project: Project, |
| 15 | + private val settings: RootSettingsExtension, |
| 16 | +) { |
| 17 | + fun createLocalInstallTasks() { |
| 18 | + project.tasks.register<Copy>(COPY_RUN_KERNEL_PY_TASK) { |
| 19 | + group = LOCAL_INSTALL_GROUP |
| 20 | + dependsOn(makeTaskName(settings.cleanInstallDirTaskPrefix, true)) |
| 21 | + from(settings.runKernelDir.resolve(settings.runKernelPy)) |
| 22 | + from(settings.distributionDir.resolve(settings.kotlinKernelModule)) { |
| 23 | + into(settings.kotlinKernelModule) |
| 24 | + } |
| 25 | + into(settings.localInstallDir) |
| 26 | + } |
| 27 | + |
| 28 | + project.tasks.register<Copy>(COPY_NB_EXTENSION_TASK) { |
| 29 | + group = LOCAL_INSTALL_GROUP |
| 30 | + from(settings.nbExtensionDir) |
| 31 | + into(settings.localInstallDir) |
| 32 | + } |
| 33 | + |
| 34 | + createInstallTasks(true, settings.localInstallDir, settings.localInstallDir) |
| 35 | + |
| 36 | + project.task(UNINSTALL_TASK) { |
| 37 | + group = LOCAL_INSTALL_GROUP |
| 38 | + dependsOn(makeTaskName(settings.cleanInstallDirTaskPrefix, false)) |
| 39 | + } |
| 40 | + } |
| 41 | + |
| 42 | + fun createInstallTasks(local: Boolean, specPath: File, mainInstallPath: File) { |
| 43 | + val groupName = if (local) LOCAL_INSTALL_GROUP else DISTRIBUTION_GROUP |
| 44 | + val cleanDirTask = project.tasks.getByName(makeTaskName(settings.cleanInstallDirTaskPrefix, local)) |
| 45 | + val shadowJar = project.tasks.getByName(SHADOW_JAR_TASK) |
| 46 | + val updateLibrariesTask = project.tasks.named(UPDATE_LIBRARIES_TASK_NAME) |
| 47 | + |
| 48 | + project.tasks.register<Copy>(makeTaskName(settings.copyLibrariesTaskPrefix, local)) { |
| 49 | + dependsOn(cleanDirTask, updateLibrariesTask) |
| 50 | + group = groupName |
| 51 | + from(settings.librariesDir) |
| 52 | + into(mainInstallPath.resolve(settings.librariesDir)) |
| 53 | + } |
| 54 | + |
| 55 | + project.tasks.register<Copy>(makeTaskName(settings.installLibsTaskPrefix, local)) { |
| 56 | + dependsOn(cleanDirTask) |
| 57 | + group = groupName |
| 58 | + from(project.configurations["deploy"]) |
| 59 | + into(mainInstallPath.resolve(settings.jarsPath)) |
| 60 | + } |
| 61 | + |
| 62 | + project.tasks.register<Copy>(makeTaskName(settings.installKernelTaskPrefix, local)) { |
| 63 | + dependsOn(cleanDirTask, shadowJar) |
| 64 | + group = groupName |
| 65 | + from(shadowJar.outputs) |
| 66 | + into(mainInstallPath.resolve(settings.jarsPath)) |
| 67 | + } |
| 68 | + |
| 69 | + listOf(true, false).forEach { debug -> |
| 70 | + val specTaskName = createTaskForSpecs(debug, local, groupName, cleanDirTask, shadowJar, specPath, mainInstallPath) |
| 71 | + createMainInstallTask(debug, local, groupName, specTaskName) |
| 72 | + } |
| 73 | + } |
| 74 | + |
| 75 | + private fun createTaskForSpecs(debug: Boolean, local: Boolean, group: String, cleanDir: Task, shadowJar: Task, specPath: File, mainInstallPath: File): String { |
| 76 | + val taskName = makeTaskName(if (debug) "createDebugSpecs" else "createSpecs", local) |
| 77 | + project.tasks.register(taskName) { |
| 78 | + this.group = group |
| 79 | + dependsOn(cleanDir, shadowJar) |
| 80 | + doLast { |
| 81 | + val kernelFile = project.files(shadowJar).singleFile |
| 82 | + |
| 83 | + val libsCp = project.files(project.configurations["deploy"]).files.map { it.name } |
| 84 | + |
| 85 | + makeDirs(mainInstallPath.resolve(settings.jarsPath)) |
| 86 | + makeDirs(mainInstallPath.resolve(settings.configDir)) |
| 87 | + makeDirs(specPath) |
| 88 | + |
| 89 | + writeJson( |
| 90 | + mapOf( |
| 91 | + "mainJar" to kernelFile.name, |
| 92 | + "mainClass" to settings.mainClassFQN, |
| 93 | + "classPath" to libsCp, |
| 94 | + "debuggerConfig" to if (debug) settings.debuggerConfig else "" |
| 95 | + ), |
| 96 | + mainInstallPath.resolve(settings.jarArgsFile) |
| 97 | + ) |
| 98 | + makeKernelSpec(specPath, local) |
| 99 | + } |
| 100 | + } |
| 101 | + return taskName |
| 102 | + } |
| 103 | + |
| 104 | + private fun createMainInstallTask(debug: Boolean, local: Boolean, group: String, specsTaskName: String) { |
| 105 | + val taskNamePrefix = if (local) "install" else "prepare" |
| 106 | + val taskNameMiddle = if (debug) "Debug" else "" |
| 107 | + val taskNameSuffix = if (local) "" else "Package" |
| 108 | + val taskName = "$taskNamePrefix$taskNameMiddle$taskNameSuffix" |
| 109 | + |
| 110 | + val dependencies = listOf( |
| 111 | + makeTaskName(settings.cleanInstallDirTaskPrefix, local), |
| 112 | + if (local) project.tasks.getByName(COPY_RUN_KERNEL_PY_TASK) else project.tasks.getByName(PREPARE_DISTRIBUTION_DIR_TASK), |
| 113 | + makeTaskName(settings.installKernelTaskPrefix, local), |
| 114 | + makeTaskName(settings.installLibsTaskPrefix, local), |
| 115 | + specsTaskName, |
| 116 | + makeTaskName(settings.copyLibrariesTaskPrefix, local) |
| 117 | + ) |
| 118 | + |
| 119 | + project.task(taskName) { |
| 120 | + this.group = group |
| 121 | + dependsOn(dependencies) |
| 122 | + } |
| 123 | + } |
| 124 | + |
| 125 | + private fun makeKernelSpec(installPath: File, localInstall: Boolean) { |
| 126 | + val argv = if (localInstall) { |
| 127 | + listOf( |
| 128 | + "python", |
| 129 | + installPath.resolve(settings.runKernelPy).toString(), |
| 130 | + "{connection_file}", |
| 131 | + installPath.resolve(settings.jarArgsFile).toString(), |
| 132 | + installPath.toString() |
| 133 | + ) |
| 134 | + } else { |
| 135 | + listOf("python", "-m", "run_kotlin_kernel", "{connection_file}") |
| 136 | + } |
| 137 | + |
| 138 | + writeJson( |
| 139 | + mapOf( |
| 140 | + "display_name" to "Kotlin", |
| 141 | + "language" to "kotlin", |
| 142 | + "interrupt_mode" to "message", |
| 143 | + "argv" to argv |
| 144 | + ), |
| 145 | + installPath.resolve(settings.kernelFile) |
| 146 | + ) |
| 147 | + |
| 148 | + project.copy { |
| 149 | + from(settings.nbExtensionDir, settings.logosDir) |
| 150 | + into(installPath) |
| 151 | + } |
| 152 | + } |
| 153 | +} |
0 commit comments