@@ -14,14 +14,12 @@ import org.gradle.api.artifacts.Dependency
1414import org.gradle.api.artifacts.DependencySet
1515import org.gradle.api.file.ConfigurableFileCollection
1616import org.gradle.api.file.DuplicatesStrategy
17- import org.gradle.api.file.RegularFile
1817import org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact
1918import org.gradle.api.internal.plugins.DefaultArtifactPublicationSet
2019import org.gradle.api.plugins.ExtensionAware
2120import org.gradle.api.plugins.JavaPlugin
2221import org.gradle.api.plugins.JavaPlugin.COMPILE_JAVA_TASK_NAME
2322import org.gradle.api.plugins.PluginInstantiationException
24- import org.gradle.api.provider.Provider
2523import org.gradle.api.tasks.ClasspathNormalizer
2624import org.gradle.api.tasks.PathSensitivity
2725import org.gradle.api.tasks.SourceSetContainer
@@ -424,20 +422,38 @@ abstract class IntelliJPlugin : Plugin<Project> {
424422
425423 val setupDependenciesTaskProvider = project.tasks.named<SetupDependenciesTask >(SETUP_DEPENDENCIES_TASK_NAME )
426424 val jarTaskProvider = project.tasks.named<Jar >(JavaPlugin .JAR_TASK_NAME )
425+ val runtimeConfiguration = project.configurations.getByName(JavaPlugin .RUNTIME_CLASSPATH_CONFIGURATION_NAME )
427426
427+ val ideaDependencyJarFiles = setupDependenciesTaskProvider.flatMap { setupDependenciesTask ->
428+ setupDependenciesTask.idea.map {
429+ project.files(it.jarFiles)
430+ }
431+ }
432+ val jarArchiveFile = jarTaskProvider.flatMap { jarTask ->
433+ jarTask.archiveFile
434+ }
435+ val runtimeConfigurationFiles = project.provider {
436+ runtimeConfiguration.allDependencies.flatMap {
437+ runtimeConfiguration.fileCollection(it)
438+ }
439+ }
428440 val gradleVersion = project.provider { project.gradle.gradleVersion }
429441 val projectVersion = project.provider { project.version }
430- val version = project.provider { project.version }
431442 val buildSdk = project.provider {
432- when (extension.localPath.orNull) {
433- null -> " ${extension.getVersionType()} -${extension.getVersionNumber()} "
434- else -> setupDependenciesTaskProvider.get().idea.get().classes.let { ideaClasses ->
435- ideProductInfo(ideaClasses)?.run { " $productCode -$version " }
436- // Fall back on build number if product-info.json is not present, this is the case
437- // for recent versions of Android Studio.
438- ? : ideBuildNumber(ideaClasses)
443+ extension.localPath.flatMap {
444+ setupDependenciesTaskProvider.flatMap { setupDependenciesTask ->
445+ setupDependenciesTask.idea.map { ideaDependency ->
446+ ideaDependency.classes.let {
447+ ideProductInfo(it)?.run { " $productCode -$projectVersion " }
448+ // Fall back on build number if product-info.json is not present, this is the case
449+ // for recent versions of Android Studio.
450+ ? : ideBuildNumber(it)
451+ }
452+ }
439453 }
440- }
454+ }.orElse(project.provider {
455+ " ${extension.getVersionType()} -${extension.getVersionNumber()} "
456+ })
441457 }
442458
443459 jarTaskProvider.configure {
@@ -457,24 +473,39 @@ abstract class IntelliJPlugin : Plugin<Project> {
457473 project.tasks.register<PrepareSandboxTask >(taskName) {
458474 group = PLUGIN_GROUP_NAME
459475 description = " Prepares sandbox directory with installed plugin and its dependencies."
476+ duplicatesStrategy = DuplicatesStrategy .FAIL
460477
461478 pluginName.convention(extension.pluginName)
462- pluginJar.convention(jarTaskProvider.get().archiveFile )
479+ pluginJar.convention(jarArchiveFile )
463480 defaultDestinationDir.convention(extension.sandboxDir.map {
464481 project.file(" $it /plugins$testSuffix " )
465482 })
466483 configDir.convention(extension.sandboxDir.map {
467484 " $it /config$testSuffix "
468485 })
469- librariesToIgnore.convention(setupDependenciesTaskProvider.get().idea.map {
470- project.files(it.jarFiles)
471- })
486+ librariesToIgnore.convention(ideaDependencyJarFiles)
472487 pluginDependencies.convention(project.provider {
473488 extension.getPluginDependenciesList(project)
474489 })
475490
491+
492+ intoChild(pluginName.map { " $it /lib" })
493+ .from(runtimeConfigurationFiles.map { files ->
494+ val librariesToIgnore = librariesToIgnore.get().toSet() + Jvm .current().toolsJar
495+ val pluginDirectories = pluginDependencies.get().map { it.artifact.canonicalPath }
496+
497+ listOf (pluginJar.get().asFile) + files.filter { file ->
498+ ! (librariesToIgnore.contains(file) || pluginDirectories.any { p ->
499+ file.canonicalPath == p || file.canonicalPath.startsWith(" $p${File .separator} " )
500+ })
501+ }
502+ })
503+ .eachFile {
504+ name = ensureName(file.toPath())
505+ }
506+
476507 dependsOn(JavaPlugin .JAR_TASK_NAME )
477- dependsOn(project.configurations.getByName( JavaPlugin . RUNTIME_CLASSPATH_CONFIGURATION_NAME ) )
508+ dependsOn(runtimeConfiguration )
478509 dependsOn(SETUP_DEPENDENCIES_TASK_NAME )
479510
480511 configure?.invoke(this )
@@ -1274,9 +1305,13 @@ abstract class IntelliJPlugin : Plugin<Project> {
12741305 channels.convention(listOf (" default" ))
12751306
12761307 distributionFile.convention(
1277- signPluginTaskProvider.flatMap { signPluginTask ->
1278- signPluginTask.outputArchiveFile
1279- }.orElse(resolveBuildTaskOutput(project))
1308+ signPluginTaskProvider
1309+ .flatMap { signPluginTask ->
1310+ when (signPluginTask.didWork) {
1311+ true -> signPluginTask.outputArchiveFile
1312+ else -> resolveBuildTaskOutput(project)
1313+ }
1314+ }
12801315 )
12811316
12821317 dependsOn(BUILD_PLUGIN_TASK_NAME )
0 commit comments