Write GitHub Actions scripts #40

Merged
CommanderTvis merged 7 commits from commandertvis/ga into dev 2022-03-16 11:31:43 +03:00
21 changed files with 600 additions and 404 deletions
Showing only changes of commit a915d2256d - Show all commits

View File

@ -17,105 +17,111 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed ### Fixed
### Security ### Security
## [0.10.2]
## [0.10.4]
### Added ### Added
- Experimental automatic JS project bundling in MPP
### Changed ### Changed
- Kotlin 1.6
### Deprecated ### Deprecated
### Removed ### Removed
### Fixed ### Fixed
-Release task (#19) - Some issues with opt-ins
### Security ### Security
## [0.10.2]
### Added
- Experimental automatic JS project bundling in MPP
### Changed
- Remove vcs requirement for Space publication
### Fixed
-Release task (#19)
## [0.10.0] ## [0.10.0]
### Added ### Added
- Lazy readme properties - Lazy readme properties
- BOM for kotlin-wrappers on JS - BOM for kotlin-wrappers on JS
- Jupyter loader - Jupyter loader
### Changed ### Changed
- API validation disabled for dev versions - API validation disabled for dev versions
- Kotlin plugins are propagated downstream - Kotlin plugins are propagated downstream
### Deprecated
### Removed ### Removed
- bson support - bson support
### Fixed
### Security
## [0.9.5] ## [0.9.5]
### Added ### Added
- Disable API validation for snapshots - Disable API validation for snapshots
- `-Xjvm-default=all` on JVM - `-Xjvm-default=all` on JVM
### Changed ### Changed
- `publication.platform` changed to `publishing.platform` - `publication.platform` changed to `publishing.platform`
- Dokka version to `1.4.30` - Dokka version to `1.4.30`
- `useDateTime` in extension - `useDateTime` in extension
- Kotlin 1.5 - Kotlin 1.5
### Deprecated
### Removed ### Removed
- Publish plugin. Use MavenPublish instead - Publish plugin. Use MavenPublish instead
### Fixed ### Fixed
- Removed unnecessary `afterEvaluate` for compatibility with gradle 7.0 - Removed unnecessary `afterEvaluate` for compatibility with gradle 7.0
### Security
## [0.9.0] ## [0.9.0]
### Added ### Added
- Skip sonatype publishing for dev versions - Skip sonatype publishing for dev versions
### Changed ### Changed
- Publishing repositories are explicit and defined in the top level project - Publishing repositories are explicit and defined in the top level project
- Paths to publishing properties now use dot notation like `publishing.github.user` - Paths to publishing properties now use dot notation like `publishing.github.user`
### Deprecated ### Deprecated
- Publishing plugin - Publishing plugin
### Removed ### Removed
- Bintray publishing - Bintray publishing
### Fixed
### Security
## [0.8.4] ## [0.8.4]
### Added ### Added
- Adaptive support for host OS in native - Adaptive support for host OS in native
- CSS support for JS targets - CSS support for JS targets
### Changed ### Changed
- Kotlin 1.4.31 - Kotlin 1.4.31
- Coroutines 1.4.3 - Coroutines 1.4.3
### Deprecated
### Removed
### Fixed ### Fixed
- Plugin loading order for publishing - Plugin loading order for publishing
- Release task - Release task
- Readme generation for multi-module project - Readme generation for multi-module project
### Security
## [0.8.1] ## [0.8.1]
### Added ### Added
- Ktor version to versions - Ktor version to versions
- Add sonatype publishing - Add sonatype publishing
- Per-platform release publishing - Per-platform release publishing
### Changed ### Changed
- Kotlin to 1.4.30 stable. - Kotlin to 1.4.30 stable.
- Added intermediate jsCommon main/test sourcesSet for node plugin. - Added intermediate jsCommon main/test sourcesSet for node plugin.
@ -123,19 +129,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Common plugin id changed to `common` - Common plugin id changed to `common`
- Plugins group changed to `ru.mipt.npm` with `gradle` prefix - Plugins group changed to `ru.mipt.npm` with `gradle` prefix
### Deprecated
### Removed ### Removed
- kaml - kaml
### Fixed ### Fixed
- Fix publishing load order for sonatype - Fix publishing load order for sonatype
- Fix root project readme - Fix root project readme
### Security
## [0.7.4] ## [0.7.4]
### Added ### Added
- Changelog plugin automatically applied to `project`. - Changelog plugin automatically applied to `project`.
- Feature matrix and Readme generation task for a `project` plugin. - Feature matrix and Readme generation task for a `project` plugin.
@ -144,6 +147,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Moved all logic to a common plugin, leaving only proxies for platform plugins - Moved all logic to a common plugin, leaving only proxies for platform plugins
- Suppress API validation for modules with maturity below DEVELOPMENT - Suppress API validation for modules with maturity below DEVELOPMENT
### Changed ### Changed
- Remove node plugin. Node binaries should be turned on manually. - Remove node plugin. Node binaries should be turned on manually.
- Use default webpack distribution path. - Use default webpack distribution path.
@ -154,29 +158,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Moved internals to internals - Moved internals to internals
- Kotlin 1.4.30-RC - Kotlin 1.4.30-RC
### Deprecated ### Deprecated
- Support of `kaml` and `snake-yaml` in favor of `yamlKt` - Support of `kaml` and `snake-yaml` in favor of `yamlKt`
- Publish plugin - Publish plugin
### Removed ### Removed
- `useDokka` method. Documentation jar should be added manually if needed. - `useDokka` method. Documentation jar should be added manually if needed.
### Fixed
### Security
## [0.6.0] ## [0.6.0]
### Added ### Added
- Migrate to kotlin 1.4.0 - Migrate to kotlin 1.4.0
- Separate Native (current platform) and nodeJs plugins. - Separate Native (current platform) and nodeJs plugins.
- Add `application()` toggle in plugin configuration to produce binaries on JS and applicaion plugin on jvm. - Add `application()` toggle in plugin configuration to produce binaries on JS and applicaion plugin on jvm.
- Add `publish` to expose publishing configuration. - Add `publish` to expose publishing configuration.
### Changed ### Changed
-Publishing in bintray now is automatic. -Publishing in bintray now is automatic.
## [0.5.2] ## [0.5.2]
### Added ### Added
- Copy resources for jvm modules and jvm source sets in mpp. - Copy resources for jvm modules and jvm source sets in mpp.

View File

@ -1,14 +1,15 @@
plugins { plugins {
alias(libs.plugins.changelog)
alias(libs.plugins.dokka)
`java-gradle-plugin` `java-gradle-plugin`
`kotlin-dsl` `kotlin-dsl`
`maven-publish` `maven-publish`
signing signing
alias(libs.plugins.changelog) `version-catalog`
alias(libs.plugins.dokka)
} }
group = "ru.mipt.npm" group = "ru.mipt.npm"
version = "0.10.2" version = libs.versions.tools.get()
description = "Build tools for DataForge and kscience projects" description = "Build tools for DataForge and kscience projects"
@ -22,6 +23,8 @@ repositories {
java.targetCompatibility = JavaVersion.VERSION_11 java.targetCompatibility = JavaVersion.VERSION_11
kotlin.explicitApiWarning()
dependencies { dependencies {
api(libs.kotlin.gradle) api(libs.kotlin.gradle)
implementation(libs.atomicfu.gradle) implementation(libs.atomicfu.gradle)
@ -30,8 +33,19 @@ dependencies {
implementation(libs.dokka.gradle) implementation(libs.dokka.gradle)
implementation(libs.kotlin.jupyter.gradle) implementation(libs.kotlin.jupyter.gradle)
implementation(libs.kotlin.serialization) implementation(libs.kotlin.serialization)
implementation("org.tomlj:tomlj:1.0.0")
// // nexus publishing plugin
// implementation("io.github.gradle-nexus:publish-plugin:1.1.0")
testImplementation(kotlin("test"))
} }
tasks.test {
useJUnitPlatform()
}
//declaring exported plugins
gradlePlugin { gradlePlugin {
plugins { plugins {
create("common") { create("common") {
@ -78,9 +92,13 @@ gradlePlugin {
} }
} }
afterEvaluate { //publishing version catalog
publishing {
val vcs = "https://github.com/mipt-npm/gradle-tools" catalog.versionCatalog {
from(files("gradle/libs.versions.toml"))
}
//publishing the artifact
val sourcesJar by tasks.creating(Jar::class) { val sourcesJar by tasks.creating(Jar::class) {
archiveClassifier.set("sources") archiveClassifier.set("sources")
@ -88,19 +106,31 @@ afterEvaluate {
} }
val javadocsJar by tasks.creating(Jar::class) { val javadocsJar by tasks.creating(Jar::class) {
group = "documentation" group = JavaBasePlugin.DOCUMENTATION_GROUP
archiveClassifier.set("javadoc") archiveClassifier.set("javadoc")
from(tasks.dokkaHtml) from(tasks.dokkaHtml)
} }
afterEvaluate {
publishing {
val vcs = "https://github.com/mipt-npm/gradle-tools"
// Process each publication we have in this project // Process each publication we have in this project
publications.filterIsInstance<MavenPublication>().forEach { publication -> publications {
publication.apply { create<MavenPublication>("catalog") {
from(components["versionCatalog"])
this.artifactId = "version-catalog"
pom {
name.set("version-catalog")
}
}
withType<MavenPublication> {
artifact(sourcesJar) artifact(sourcesJar)
artifact(javadocsJar) artifact(javadocsJar)
pom { pom {
name.set(project.name)
description.set(project.description) description.set(project.description)
url.set(vcs) url.set(vcs)
@ -157,10 +187,6 @@ afterEvaluate {
"https://oss.sonatype.org/service/local/staging/deploy/maven2" "https://oss.sonatype.org/service/local/staging/deploy/maven2"
} }
if (plugins.findPlugin("signing") == null) {
plugins.apply("signing")
}
repositories.maven { repositories.maven {
name = "sonatype" name = "sonatype"
url = uri(sonatypeRepo) url = uri(sonatypeRepo)
@ -171,6 +197,10 @@ afterEvaluate {
} }
} }
if (plugins.findPlugin("signing") == null) {
apply<SigningPlugin>()
}
signing { signing {
//useGpgCmd() //useGpgCmd()
sign(publications) sign(publications)
@ -178,3 +208,8 @@ afterEvaluate {
} }
} }
} }
tasks.processResources.configure {
duplicatesStrategy = org.gradle.api.file.DuplicatesStrategy.INCLUDE
from("gradle/libs.versions.toml")
}

View File

@ -1,26 +1,167 @@
[versions] [versions]
tools = "0.10.4"
kotlin = "1.6.0-M1"
atomicfu = "0.16.2" atomicfu = "0.16.2"
binary-compatibility-validator = "0.6.0" binary-compatibility-validator = "0.7.1"
changelog = "1.2.1" changelog = "1.3.0"
dokka = "1.5.0" dokka = "1.5.0"
kotlin = "1.5.21" kotlin-jupyter = "0.10.0-227"
kotlin-jupyter = "0.10.0-173" kotlinx-benchmark = "0.3.1"
kotlinx-cli = "0.3.2"
kotlinx-collections-immutable = "0.3.4"
kotlinx-coroutines = "1.5.2"
kotlinx-datetime = "0.2.1"
kotlinx-html = "0.7.3"
kotlinx-knit = "0.2.3"
kotlinx-nodejs = "0.0.7"
kotlinx-serialization = "1.3.0"
ktor = "1.6.3"
xmlutil = "0.83.0"
yamlkt = "0.10.2"
jsBom = "0.0.1-pre.248-kotlin-1.5.31"
[libraries] [libraries]
atomicfu-gradle = { module = "org.jetbrains.kotlinx:atomicfu-gradle-plugin", version.ref = "atomicfu" } atomicfu-gradle = { module = "org.jetbrains.kotlinx:atomicfu-gradle-plugin", version.ref = "atomicfu" }
atomicfu = { module = "org.jetbrains.kotlinx:atomicfu", version.ref = "atomicfu" }
binary-compatibility-validator = { module = "org.jetbrains.kotlinx:binary-compatibility-validator", version.ref = "binary-compatibility-validator" }
changelog-gradle = { module = "org.jetbrains.intellij.plugins:gradle-changelog-plugin", version.ref = "changelog" } changelog-gradle = { module = "org.jetbrains.intellij.plugins:gradle-changelog-plugin", version.ref = "changelog" }
dokka-gradle = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } dokka-gradle = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" }
kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" } kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" }
[kotlin-jupyter-gradle] kotlin-jupyter-gradle = { module = "org.jetbrains.kotlin:kotlin-jupyter-api-gradle-plugin", version.ref = "kotlin-jupyter" }
module = "org.jetbrains.kotlin:kotlin-jupyter-api-gradle-plugin"
version.ref = "kotlin-jupyter"
[libraries.binary-compatibility-validator] kotlinx-benchmark-runtime = { module = "org.jetbrains.kotlinx:kotlinx-benchmark-runtime", version.ref = "kotlinx-benchmark" }
module = "org.jetbrains.kotlinx:binary-compatibility-validator"
version.ref = "binary-compatibility-validator" kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinx-collections-immutable" }
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-debug = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-debug", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-reactive = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactive", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-reactor = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactor", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-rx2 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-rx2", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-rx3 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-rx3", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-javafx = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-javafx", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-jdk8 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-guava = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-guava", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-slf4j = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-slf4j", version.ref = "kotlinx-coroutines" }
kotlinx-coroutines-play-services = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services", version.ref = "kotlinx-coroutines" }
kotlinx-cli = { module = "org.jetbrains.kotlinx:kotlinx-cli", version.ref = "kotlinx-cli" }
kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" }
kotlinx-html = { module = "org.jetbrains.kotlinx:kotlinx-html", version.ref = "kotlinx-html" }
kotlinx-knit = { module = "org.jetbrains.kotlinx:kotlinx-knit", version.ref = "kotlinx-knit" }
kotlinx-nodejs = { module = "org.jetbrains.kotlinx:kotlinx-nodejs", version.ref = "kotlinx-nodejs" }
kotlinx-serialization-cbor = { module = "org.jetbrains.kotlinx:kotlinx-serialization-cbor", version.ref = "kotlinx-serialization" }
kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinx-serialization" }
kotlinx-serialization-hocon = { module = "org.jetbrains.kotlinx:kotlinx-serialization-hocon", version.ref = "kotlinx-serialization" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" }
kotlinx-serialization-protobuf = { module = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf", version.ref = "kotlinx-serialization" }
kotlinx-serialization-properties = { module = "org.jetbrains.kotlinx:kotlinx-serialization-properties", version.ref = "kotlinx-serialization" }
ktor-bom = { module = "io.ktor:ktor-bom", version.ref = "ktor" }
ktor-client-android = { module = "io.ktor:ktor-client-android", version.ref = "ktor" }
ktor-client-apache = { module = "io.ktor:ktor-client-apache", version.ref = "ktor" }
ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-client-curl = { module = "io.ktor:ktor-client-curl", version.ref = "ktor" }
ktor-client-auth-basic = { module = "io.ktor:ktor-client-auth-basic", version.ref = "ktor" }
ktor-client-auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" }
ktor-client-encoding = { module = "io.ktor:ktor-client-encoding", version.ref = "ktor" }
ktor-client-json = { module = "io.ktor:ktor-client-json", version.ref = "ktor" }
ktor-client-gson = { module = "io.ktor:ktor-client-gson", version.ref = "ktor" }
ktor-client-jackson = { module = "io.ktor:ktor-client-jackson", version.ref = "ktor" }
ktor-client-serialization = { module = "io.ktor:ktor-client-serialization", version.ref = "ktor" }
ktor-client-logging = { module = "io.ktor:ktor-client-loggin", version.ref = "ktor" }
ktor-client-tracing = { module = "io.ktor:ktor-client-tracing", version.ref = "ktor" }
ktor-client-websockets = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor" }
ktor-client-java = { module = "io.ktor:ktor-client-java", version.ref = "ktor" }
ktor-client-jetty = { module = "io.ktor:ktor-client-jetty", version.ref = "ktor" }
ktor-client-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" }
ktor-client-mock = { module = "io.ktor:ktor-client-mock", version.ref = "ktor" }
ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
ktor-auth-jwt = { module = "io.ktor:ktor-auth-jwt", version.ref = "ktor" }
ktor-auth-ldap = { module = "io.ktor:ktor-auth-ldap", version.ref = "ktor" }
ktor-auth = { module = "io.ktor:ktor-auth", version.ref = "ktor" }
ktor-freemaker = { module = "io.ktor:ktor-freemaker", version.ref = "ktor" }
ktor-gson = { module = "io.ktor:ktor-gson", version.ref = "ktor" }
ktor-html-builder = { module = "io.ktor:ktor-html-builder", version.ref = "ktor" }
ktor-jackson = { module = "io.ktor:ktor-jackson", version.ref = "ktor" }
ktor-locations = { module = "io.ktor:ktor-locations", version.ref = "ktor" }
ktor-metrics-micrometer = { module = "io.ktor:ktor-metrics-micrometer", version.ref = "ktor" }
ktor-metrics = { module = "io.ktor:ktor-metrics", version.ref = "ktor" }
ktor-mustache = { module = "io.ktor:ktor-mustache", version.ref = "ktor" }
ktor-pebble = { module = "io.ktor:ktor-pebble", version.ref = "ktor" }
ktor-serialization = { module = "io.ktor:ktor-serialization", version.ref = "ktor" }
ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = "ktor" }
ktor-thymeleaf = { module = "io.ktor:ktor-thymeleaf", version.ref = "ktor" }
ktor-velocity = { module = "io.ktor:ktor-velocity", version.ref = "ktor" }
ktor-webjars = { module = "io.ktor:ktor-webjars", version.ref = "ktor" }
ktor-websockets = { module = "io.ktor:ktor-websockets", version.ref = "ktor" }
ktor-http = { module = "io.ktor:ktor-http", version.ref = "ktor" }
ktor-http-cio = { module = "io.ktor:ktor-http-cio", version.ref = "ktor" }
ktor-io = { module = "io.ktor:ktor-io", version.ref = "ktor" }
ktor-network = { module = "io.ktor:ktor-network", version.ref = "ktor" }
ktor-network-tls = { module = "io.ktor:ktor-network-tls", version.ref = "ktor" }
ktor-network-tls-certificates = { module = "io.ktor:ktor-network-tls-certificates", version.ref = "ktor" }
ktor-server-cio = { module = "io.ktor:ktor-server-cio", version.ref = "ktor" }
ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktor" }
ktor-server-host-common = { module = "io.ktor:ktor-server-host-common", version.ref = "ktor" }
ktor-server-jetty = { module = "io.ktor:ktor-server-jetty", version.ref = "ktor" }
ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" }
ktor-server-servlet = { module = "io.ktor:ktor-server-servlet", version.ref = "ktor" }
ktor-server-test-host = { module = "io.ktor:ktor-server-test-host", version.ref = "ktor" }
ktor-server-tomcat = { module = "io.ktor:ktor-server-tomcat", version.ref = "ktor" }
ktor-test-dispatcher = { module = "io.ktor:ktor-test-dispatcher", version.ref = "ktor" }
ktor-utils = { module = "io.ktor:ktor-utils", version.ref = "ktor" }
xmlutil-core = { module = "io.github.pdvrieze.xmlutil:core", version.ref = "xmlutil" }
xmlutil-ktor = { module = "io.github.pdvrieze.xmlutil:ktor", version.ref = "xmlutil" }
xmlutil-serialization = { module = "io.github.pdvrieze.xmlutil:serialization", version.ref = "xmlutil" }
yamlkt = { module = "net.mamoe.yamlkt:yamlkt", version.ref = "yamlkt" }
[plugins] [plugins]
changelog = { id = "org.jetbrains.changelog", version.ref = "changelog" } changelog = { id = "org.jetbrains.changelog", version.ref = "changelog" }
dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
gradle-common = { id = "ru.mipt.npm.gradle.common", version.ref = "tools" }
gradle-project = { id = "ru.mipt.npm.gradle.project", version.ref = "tools" }
gradle-mpp = { id = "ru.mipt.npm.gradle.mpp", version.ref = "tools" }
gradle-jvm = { id = "ru.mipt.npm.gradle.jvm", version.ref = "tools" }
gradle-js = { id = "ru.mipt.npm.gradle.js", version.ref = "tools" }
gradle-native = { id = "ru.mipt.npm.gradle.native", version.ref = "tools" }
gradle-node = { id = "ru.mipt.npm.gradle.node", version.ref = "tools" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-android-extensions = { id = "org.jetbrains.kotlin.android.extensions", version.ref = "kotlin" }
kotlin-js = { id = "org.jetbrains.kotlin.js", version.ref = "kotlin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlin-native-cocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" }
kotlin-plugin-allopen = { id = "org.jetbrains.kotlin.plugin.allopen", version.ref = "kotlin" }
kotlin-plugin-jpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin" }
kotlin-plugin-lombok = { id = "org.jetbrains.kotlin.plugin.lombok", version.ref = "kotlin" }
kotlin-plugin-noarg = { id = "org.jetbrains.kotlin.plugin.noarg", version.ref = "kotlin" }
kotlin-plugin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
kotlin-plugin-scripting = { id = "org.jetbrains.kotlin.plugin.scripting", version.ref = "kotlin" }
kotlin-plugin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
kotlin-plugin-spring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" }
kotlin-jupyter-api = { id = "org.jetbrains.kotlin.jupyter.api", version.ref = "kotlin-jupyter" }
kotlinx-benchmark = { id = "org.jetbrains.kotlinx.benchmark", version.ref = "kotlinx-benchmark" }

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-rc-2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -1,2 +1,3 @@
rootProject.name = "gradle-tools" rootProject.name = "gradle-tools"
enableFeaturePreview("VERSION_CATALOGS") enableFeaturePreview("VERSION_CATALOGS")

View File

@ -6,6 +6,7 @@ import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.tasks.Copy import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.testing.Test import org.gradle.api.tasks.testing.Test
import org.gradle.kotlin.dsl.* import org.gradle.kotlin.dsl.*
import org.jetbrains.dokka.gradle.DokkaPlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
@ -15,7 +16,7 @@ import ru.mipt.npm.gradle.internal.applySettings
import ru.mipt.npm.gradle.internal.fromJsDependencies import ru.mipt.npm.gradle.internal.fromJsDependencies
@Suppress("UNUSED_VARIABLE") @Suppress("UNUSED_VARIABLE")
open class KScienceCommonPlugin : Plugin<Project> { public open class KScienceCommonPlugin : Plugin<Project> {
override fun apply(project: Project): Unit = project.run { override fun apply(project: Project): Unit = project.run {
//Common configuration //Common configuration
registerKScienceExtension() registerKScienceExtension()
@ -27,12 +28,11 @@ open class KScienceCommonPlugin : Plugin<Project> {
configure<KotlinJvmProjectExtension> { configure<KotlinJvmProjectExtension> {
explicitApiWarning() explicitApiWarning()
sourceSets["main"].apply { sourceSets.all {
languageSettings.applySettings() languageSettings.applySettings()
} }
sourceSets["test"].apply { sourceSets["test"].apply {
languageSettings.applySettings()
dependencies { dependencies {
implementation(kotlin("test-junit5")) implementation(kotlin("test-junit5"))
implementation("org.junit.jupiter:junit-jupiter:5.6.1") implementation("org.junit.jupiter:junit-jupiter:5.6.1")
@ -50,12 +50,10 @@ open class KScienceCommonPlugin : Plugin<Project> {
targetCompatibility = KScienceVersions.JVM_TARGET targetCompatibility = KScienceVersions.JVM_TARGET
} }
tasks.apply { tasks.withType<Test> {
withType<Test> {
useJUnitPlatform() useJUnitPlatform()
} }
} }
}
pluginManager.withPlugin("org.jetbrains.kotlin.js") { pluginManager.withPlugin("org.jetbrains.kotlin.js") {
//logger.info("Applying KScience configuration for JS project") //logger.info("Applying KScience configuration for JS project")
@ -70,15 +68,17 @@ open class KScienceCommonPlugin : Plugin<Project> {
} }
} }
sourceSets["main"].apply { sourceSets.all {
languageSettings.applySettings() languageSettings.applySettings()
}
sourceSets["main"].apply {
dependencies { dependencies {
api(project.dependencies.platform("org.jetbrains.kotlin-wrappers:kotlin-wrappers-bom:${KScienceVersions.jsBom}")) api(project.dependencies.platform("org.jetbrains.kotlin-wrappers:kotlin-wrappers-bom:${KScienceVersions.jsBom}"))
} }
} }
sourceSets["test"].apply { sourceSets["test"].apply {
languageSettings.applySettings()
dependencies { dependencies {
implementation(kotlin("test-js")) implementation(kotlin("test-js"))
} }
@ -112,7 +112,7 @@ open class KScienceCommonPlugin : Plugin<Project> {
} }
} }
sourceSets.invoke { sourceSets {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
api(project.dependencies.platform("org.jetbrains.kotlin-wrappers:kotlin-wrappers-bom:${KScienceVersions.jsBom}")) api(project.dependencies.platform("org.jetbrains.kotlin-wrappers:kotlin-wrappers-bom:${KScienceVersions.jsBom}"))
@ -128,7 +128,7 @@ open class KScienceCommonPlugin : Plugin<Project> {
val jvmTest by getting { val jvmTest by getting {
dependencies { dependencies {
implementation(kotlin("test-junit5")) implementation(kotlin("test-junit5"))
implementation("org.junit.jupiter:junit-jupiter:5.6.1") implementation("org.junit.jupiter:junit-jupiter:5.7.2")
} }
} }
val jsMain by getting val jsMain by getting
@ -139,13 +139,9 @@ open class KScienceCommonPlugin : Plugin<Project> {
} }
} }
afterEvaluate {
targets.all {
sourceSets.all { sourceSets.all {
languageSettings.applySettings() languageSettings.applySettings()
} }
}
}
(tasks.findByName("jsProcessResources") as? Copy)?.apply { (tasks.findByName("jsProcessResources") as? Copy)?.apply {
fromJsDependencies("jsRuntimeClasspath") fromJsDependencies("jsRuntimeClasspath")
@ -155,18 +151,15 @@ open class KScienceCommonPlugin : Plugin<Project> {
targetCompatibility = KScienceVersions.JVM_TARGET targetCompatibility = KScienceVersions.JVM_TARGET
} }
tasks.apply { tasks.withType<Test> {
withType<Test> {
useJUnitPlatform() useJUnitPlatform()
} }
} }
} }
}
// apply dokka for all projects // apply dokka for all projects
if (!plugins.hasPlugin("org.jetbrains.dokka")) { if (!plugins.hasPlugin("org.jetbrains.dokka")) {
plugins.apply("org.jetbrains.dokka") apply<DokkaPlugin>()
} }
} }
} }

View File

@ -1,17 +1,21 @@
package ru.mipt.npm.gradle package ru.mipt.npm.gradle
import kotlinx.atomicfu.plugin.gradle.AtomicFUGradlePlugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.plugins.ApplicationPlugin import org.gradle.api.plugins.ApplicationPlugin
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.findByType import org.gradle.kotlin.dsl.findByType
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlinx.jupyter.api.plugin.tasks.JupyterApiResourcesTask
import ru.mipt.npm.gradle.internal.defaultPlatform import ru.mipt.npm.gradle.internal.defaultPlatform
import ru.mipt.npm.gradle.internal.useCommonDependency import ru.mipt.npm.gradle.internal.useCommonDependency
import ru.mipt.npm.gradle.internal.useFx import ru.mipt.npm.gradle.internal.useFx
enum class FXModule(val artifact: String, vararg val dependencies: FXModule) { public enum class FXModule(public val artifact: String, public vararg val dependencies: FXModule) {
BASE("javafx-base"), BASE("javafx-base"),
GRAPHICS("javafx-graphics", BASE), GRAPHICS("javafx-graphics", BASE),
CONTROLS("javafx-controls", GRAPHICS, BASE), CONTROLS("javafx-controls", GRAPHICS, BASE),
@ -21,30 +25,29 @@ enum class FXModule(val artifact: String, vararg val dependencies: FXModule) {
WEB("javafx-web", CONTROLS, GRAPHICS, BASE) WEB("javafx-web", CONTROLS, GRAPHICS, BASE)
} }
enum class FXPlatform(val id: String) { public enum class FXPlatform(public val id: String) {
WINDOWS("win"), WINDOWS("win"),
LINUX("linux"), LINUX("linux"),
MAC("mac") MAC("mac")
} }
enum class DependencyConfiguration { public enum class DependencyConfiguration {
API, API,
IMPLEMENTATION, IMPLEMENTATION,
COMPILE_ONLY COMPILE_ONLY,
} }
enum class DependencySourceSet(val setName: String, val suffix: String) { public enum class DependencySourceSet(public val setName: String, public val suffix: String) {
MAIN("main", "Main"), MAIN("main", "Main"),
TEST("test", "Test") TEST("test", "Test")
} }
class KScienceExtension(val project: Project) { public class KScienceExtension(public val project: Project) {
/** /**
* Use coroutines-core with default version or [version] * Use coroutines-core with default version or [version]
*/ */
fun useCoroutines( public fun useCoroutines(
version: String = KScienceVersions.coroutinesVersion, version: String = KScienceVersions.coroutinesVersion,
sourceSet: DependencySourceSet = DependencySourceSet.MAIN, sourceSet: DependencySourceSet = DependencySourceSet.MAIN,
configuration: DependencyConfiguration = DependencyConfiguration.API, configuration: DependencyConfiguration = DependencyConfiguration.API,
@ -55,14 +58,14 @@ class KScienceExtension(val project: Project) {
) )
/** /**
* Use kotlinx-atmicfu plugin and library * Use kotlinx-atomicfu plugin and library
*/ */
fun useAtomic( public fun useAtomic(
version: String = KScienceVersions.atomicVersion, version: String = KScienceVersions.atomicVersion,
sourceSet: DependencySourceSet = DependencySourceSet.MAIN, sourceSet: DependencySourceSet = DependencySourceSet.MAIN,
configuration: DependencyConfiguration = DependencyConfiguration.IMPLEMENTATION, configuration: DependencyConfiguration = DependencyConfiguration.IMPLEMENTATION,
): Unit = project.run { ): Unit = project.run {
plugins.apply("kotlinx-atomicfu") apply<AtomicFUGradlePlugin>()
useCommonDependency( useCommonDependency(
"org.jetbrains.kotlinx:atomicfu:$version", "org.jetbrains.kotlinx:atomicfu:$version",
dependencySourceSet = sourceSet, dependencySourceSet = sourceSet,
@ -73,7 +76,7 @@ class KScienceExtension(val project: Project) {
/** /**
* Use core serialization library and configure targets * Use core serialization library and configure targets
*/ */
fun useSerialization( public fun useSerialization(
version: String = KScienceVersions.serializationVersion, version: String = KScienceVersions.serializationVersion,
sourceSet: DependencySourceSet = DependencySourceSet.MAIN, sourceSet: DependencySourceSet = DependencySourceSet.MAIN,
configuration: DependencyConfiguration = DependencyConfiguration.API, configuration: DependencyConfiguration = DependencyConfiguration.API,
@ -90,23 +93,23 @@ class KScienceExtension(val project: Project) {
dependencySourceSet = sourceSet, dependencySourceSet = sourceSet,
dependencyConfiguration = configuration dependencyConfiguration = configuration
) )
SerializationTargets(sourceSet, configuration).apply(block) SerializationTargets(sourceSet, configuration).block()
} }
/** /**
* Add platform-specific JavaFX dependencies with given list of [FXModule]s * Add platform-specific JavaFX dependencies with given list of [FXModule]s
*/ */
fun useFx( public fun useFx(
vararg modules: FXModule, vararg modules: FXModule,
configuration: DependencyConfiguration = DependencyConfiguration.COMPILE_ONLY, configuration: DependencyConfiguration = DependencyConfiguration.COMPILE_ONLY,
version: String = "11", version: String = "11",
platform: FXPlatform = defaultPlatform, platform: FXPlatform = defaultPlatform,
) = project.useFx(modules.toList(), configuration, version, platform) ): Unit = project.useFx(modules.toList(), configuration, version, platform)
/** /**
* Add dependency on kotlinx-html library * Add dependency on kotlinx-html library
*/ */
fun useHtml( public fun useHtml(
version: String = KScienceVersions.htmlVersion, version: String = KScienceVersions.htmlVersion,
sourceSet: DependencySourceSet = DependencySourceSet.MAIN, sourceSet: DependencySourceSet = DependencySourceSet.MAIN,
configuration: DependencyConfiguration = DependencyConfiguration.API, configuration: DependencyConfiguration = DependencyConfiguration.API,
@ -119,35 +122,44 @@ class KScienceExtension(val project: Project) {
/** /**
* Use kotlinx-datetime library with default version or [version] * Use kotlinx-datetime library with default version or [version]
*/ */
fun useDateTime( public fun useDateTime(
version: String = KScienceVersions.dateTimeVersion, version: String = KScienceVersions.dateTimeVersion,
sourceSet: DependencySourceSet = DependencySourceSet.MAIN, sourceSet: DependencySourceSet = DependencySourceSet.MAIN,
configuration: DependencyConfiguration = DependencyConfiguration.API, configuration: DependencyConfiguration = DependencyConfiguration.API,
) { ): Unit = project.useCommonDependency(
project.useCommonDependency(
"org.jetbrains.kotlinx:kotlinx-datetime:$version", "org.jetbrains.kotlinx:kotlinx-datetime:$version",
dependencySourceSet = sourceSet, dependencySourceSet = sourceSet,
dependencyConfiguration = configuration dependencyConfiguration = configuration
) )
}
/** /**
* Apply jupyter plugin * Apply jupyter plugin
*/ */
fun useJupyter() { @Deprecated("Use jupyterLibrary")
public fun useJupyter() {
project.plugins.apply("org.jetbrains.kotlin.jupyter.api") project.plugins.apply("org.jetbrains.kotlin.jupyter.api")
} }
/**
* Apply jupyter plugin and add entry point for the jupyter library
*/
public fun jupyterLibrary(pluginClass: String, vararg additionalPluginClasses: String) {
project.plugins.apply("org.jetbrains.kotlin.jupyter.api")
project.tasks.named("processJupyterApiResources", JupyterApiResourcesTask::class.java) {
libraryProducers = listOf(pluginClass, *additionalPluginClasses)
}
}
/** /**
* Mark this module as an application module. JVM application should be enabled separately * Mark this module as an application module. JVM application should be enabled separately
*/ */
fun application() { public fun application() {
project.extensions.findByType<KotlinProjectExtension>()?.apply { project.extensions.findByType<KotlinProjectExtension>()?.apply {
explicitApi = null explicitApi = null
} }
project.pluginManager.withPlugin("org.jetbrains.kotlin.jvm") { project.pluginManager.withPlugin("org.jetbrains.kotlin.jvm") {
project.plugins.apply(ApplicationPlugin::class.java) project.apply<ApplicationPlugin>()
} }
project.extensions.findByType<KotlinJsProjectExtension>()?.apply { project.extensions.findByType<KotlinJsProjectExtension>()?.apply {
@ -160,8 +172,9 @@ class KScienceExtension(val project: Project) {
js { js {
binaries.executable() binaries.executable()
} }
targets.filterIsInstance<KotlinNativeTarget>().forEach {
it.binaries.executable() targets.withType<KotlinNativeTarget> {
binaries.executable()
} }
} }
} }

View File

@ -4,13 +4,14 @@ import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.apply
open class KScienceJSPlugin : Plugin<Project> { public open class KScienceJSPlugin : Plugin<Project> {
override fun apply(project: Project): Unit = project.run { override fun apply(project: Project): Unit = project.run {
if (plugins.findPlugin("org.jetbrains.kotlin.js") == null) { if (!plugins.hasPlugin("org.jetbrains.kotlin.js")) {
pluginManager.apply("org.jetbrains.kotlin.js") plugins.apply("org.jetbrains.kotlin.js")
} else { } else {
logger.info("Kotlin JS plugin is already present") logger.info("Kotlin JS plugin is already present")
} }
plugins.apply(KScienceCommonPlugin::class)
apply<KScienceCommonPlugin>()
} }
} }

View File

@ -4,13 +4,13 @@ import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.apply
open class KScienceJVMPlugin : Plugin<Project> { public open class KScienceJVMPlugin : Plugin<Project> {
override fun apply(project: Project): Unit = project.run { override fun apply(project: Project): Unit = project.run {
if (plugins.findPlugin("org.jetbrains.kotlin.jvm") == null) { if (!plugins.hasPlugin("org.jetbrains.kotlin.jvm"))
pluginManager.apply("org.jetbrains.kotlin.jvm") plugins.apply("org.jetbrains.kotlin.jvm")
} else { else
logger.info("Kotlin JVM plugin is already present") logger.info("Kotlin JVM plugin is already present")
}
plugins.apply(KScienceCommonPlugin::class) apply<KScienceCommonPlugin>()
} }
} }

View File

@ -3,14 +3,18 @@ package ru.mipt.npm.gradle
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.hasPlugin
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
open class KScienceMPPlugin : Plugin<Project> { public open class KScienceMPPlugin : Plugin<Project> {
override fun apply(project: Project): Unit = project.run { override fun apply(project: Project): Unit = project.run {
if (plugins.findPlugin("org.jetbrains.kotlin.multiplatform") == null) { if (!plugins.hasPlugin(KotlinMultiplatformPlugin::class)) {
pluginManager.apply("org.jetbrains.kotlin.multiplatform") //apply<KotlinMultiplatformPlugin>() for some reason it does not work
plugins.apply("org.jetbrains.kotlin.multiplatform")
} else { } else {
logger.info("Kotlin MPP plugin is already present") logger.info("Kotlin MPP plugin is already present")
} }
plugins.apply(KScienceCommonPlugin::class)
apply<KScienceCommonPlugin>()
} }
} }

View File

@ -1,67 +1,56 @@
package ru.mipt.npm.gradle package ru.mipt.npm.gradle
import org.gradle.api.Action
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.*
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.findPlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
private fun KotlinMultiplatformExtension.sourceSets(configure: Action<NamedDomainObjectContainer<KotlinSourceSet>>): Unit = public class KScienceNativePlugin : Plugin<Project> {
(this as org.gradle.api.plugins.ExtensionAware).extensions.configure("sourceSets", configure) override fun apply(project: Project): Unit = project.run {
class KScienceNativePlugin : Plugin<Project> {
override fun apply(project: Project) = project.run {
//Apply multiplatform plugin is not applied, apply it //Apply multiplatform plugin is not applied, apply it
if (plugins.findPlugin("org.jetbrains.kotlin.multiplatform") == null) { if (!plugins.hasPlugin("org.jetbrains.kotlin.multiplatform")) {
logger.info("Kotlin multiplatform plugin is not resolved. Adding it automatically") logger.info("Kotlin multiplatform plugin is not resolved. Adding it automatically")
pluginManager.apply("org.jetbrains.kotlin.multiplatform") plugins.apply("org.jetbrains.kotlin.multiplatform")
} }
if (plugins.findPlugin(KScienceCommonPlugin::class) == null) {
if (!plugins.hasPlugin(KScienceCommonPlugin::class)) {
logger.info("KScience plugin is not resolved. Adding it automatically") logger.info("KScience plugin is not resolved. Adding it automatically")
pluginManager.apply(KScienceCommonPlugin::class) apply<KScienceCommonPlugin>()
} }
configure<KotlinMultiplatformExtension> { configure<KotlinMultiplatformExtension> {
val hostOs = System.getProperty("os.name") val nativeTargets = setOf(
linuxX64(),
val isLinux = hostOs == "Linux" mingwX64(),
val isMinGw = hostOs.startsWith("Windows") macosX64(),
val isMacOs = hostOs == "Mac OS X" )
if (isLinux || isMinGw) {
linuxX64()
}
if (isMinGw) {
mingwX64()
}
if (isMacOs) {
macosX64()
}
sourceSets { sourceSets {
val commonMain = findByName("commonMain")!! val commonMain = findByName("commonMain")!!
val commonTest = findByName("commonTest")!! val commonTest = findByName("commonTest")!!
val nativeMain = create("nativeMain").apply { val nativeMain by creating {
dependsOn(commonMain) dependsOn(commonMain)
} }
val nativeTest = create("nativeTest").apply { val nativeTest by creating {
dependsOn(nativeMain)
dependsOn(commonTest) dependsOn(commonTest)
} }
findByName("linuxX64Main")?.dependsOn(nativeMain) configure(nativeTargets) {
findByName("linuxX64Test")?.dependsOn(nativeTest) compilations["main"]?.apply {
configure(kotlinSourceSets) {
dependsOn(nativeMain)
}
}
findByName("mingwX64Main")?.dependsOn(nativeMain) compilations["test"]?.apply {
findByName("mingwX64Test")?.dependsOn(nativeTest) configure(kotlinSourceSets) {
dependsOn(nativeTest)
findByName("macosX64Main")?.dependsOn(nativeMain) }
findByName("macosX64Test")?.dependsOn(nativeTest) }
}
} }
} }
} }

View File

@ -1,31 +1,24 @@
package ru.mipt.npm.gradle package ru.mipt.npm.gradle
import org.gradle.api.Action
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.*
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.findPlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
private fun KotlinMultiplatformExtension.sourceSets(configure: Action<NamedDomainObjectContainer<KotlinSourceSet>>): Unit =
(this as org.gradle.api.plugins.ExtensionAware).extensions.configure("sourceSets", configure)
/** /**
* Create a separate target for node * Create a separate target for node
*/ */
class KScienceNodePlugin : Plugin<Project> { public class KScienceNodePlugin : Plugin<Project> {
override fun apply(target: Project) = target.run { override fun apply(target: Project): Unit = target.run {
//Apply multiplatform plugin is not applied, apply it //Apply multiplatform plugin is not applied, apply it
if (plugins.findPlugin("org.jetbrains.kotlin.multiplatform") == null) { if (plugins.findPlugin("org.jetbrains.kotlin.multiplatform") == null) {
logger.info("Kotlin multiplatform plugin is not resolved. Adding it automatically") logger.info("Kotlin multiplatform plugin is not resolved. Adding it automatically")
pluginManager.apply("org.jetbrains.kotlin.multiplatform") plugins.apply("org.jetbrains.kotlin.multiplatform")
} }
if (plugins.findPlugin(KScienceCommonPlugin::class) == null) { if (plugins.findPlugin(KScienceCommonPlugin::class) == null) {
logger.info("KScience plugin is not resolved. Adding it automatically") logger.info("KScience plugin is not resolved. Adding it automatically")
pluginManager.apply(KScienceCommonPlugin::class) apply<KScienceCommonPlugin>()
} }
configure<KotlinMultiplatformExtension> { configure<KotlinMultiplatformExtension> {

View File

@ -11,42 +11,70 @@ import org.jetbrains.changelog.ChangelogPlugin
import org.jetbrains.changelog.ChangelogPluginExtension import org.jetbrains.changelog.ChangelogPluginExtension
import org.jetbrains.dokka.gradle.AbstractDokkaTask import org.jetbrains.dokka.gradle.AbstractDokkaTask
import org.jetbrains.dokka.gradle.DokkaPlugin import org.jetbrains.dokka.gradle.DokkaPlugin
import org.jetbrains.dokka.gradle.DokkaTask
import ru.mipt.npm.gradle.internal.* import ru.mipt.npm.gradle.internal.*
private fun Project.allTasks(): Set<Task> = allprojects.flatMapTo(HashSet()) { it.tasks } private fun Project.allTasks(): Set<Task> = allprojects.flatMapTo(HashSet()) { it.tasks }
@Suppress("unused") @Suppress("unused")
class KSciencePublishingExtension(val project: Project) { public class KSciencePublishingExtension(public val project: Project) {
private var initializedFlag = false private var isVcsInitialized = false
fun vcs(vcsUrl: String) { @Deprecated("Use git function and report an issue if other VCS is used.")
if (!initializedFlag) { public fun vcs(vcsUrl: String) {
project.setupPublication(vcsUrl) if (!isVcsInitialized) {
initializedFlag = true project.setupPublication {
url.set(vcsUrl)
scm { url.set(vcsUrl) }
}
isVcsInitialized = true
} }
} }
/** /**
* github publishing * Configures Git repository (sources) for the publication.
* @param publish include github packages in release publishing. By default - false *
* @param vcsUrl URL of the repository's web interface.
* @param connectionUrl URL of the Git repository.
* @param developerConnectionUrl URL of the Git repository for developers.
*/ */
fun github(githubProject: String, githubOrg: String = "mipt-npm", publish: Boolean = false) { public fun git(vcsUrl: String, connectionUrl: String? = null, developerConnectionUrl: String? = connectionUrl) {
//automatically initialize vcs using github if (!isVcsInitialized) {
if (!initializedFlag) { project.setupPublication {
vcs("https://github.com/$githubOrg/$githubProject") url.set(vcsUrl)
scm {
url.set(vcsUrl)
connectionUrl?.let { connection.set("scm:git:$it") }
developerConnectionUrl?.let { developerConnection.set("scm:git:$it") }
}
} }
project.addGithubPublishing(githubOrg, githubProject) isVcsInitialized = true
}
}
if (publish) private fun linkPublicationsToReleaseTask(name: String) = project.afterEvaluate {
project.afterEvaluate {
allTasks() allTasks()
.find { it.name == "publish${publicationTarget}ToGithubRepository" } .filter { it.name == "publish${publicationTarget}To${name.capitalize()}Repository" }
?.let { publicationTask -> .forEach { releaseTask?.dependsOn(it) }
releaseTask?.dependsOn(publicationTask)
} }
/**
* Adds GitHub as VCS and adds GitHub Packages Maven repository to publishing.
*
* @param githubProject the GitHub project.
* @param githubOrg the GitHub user or organization.
* @param release whether publish packages in the `release` task to the GitHub repository.
*/
public fun github(githubProject: String, githubOrg: String = "mipt-npm", release: Boolean = false, publish: Boolean = true) {
// Automatically initialize VCS using GitHub
if (!isVcsInitialized) {
git("https://github.com/$githubOrg/${githubProject}", "https://github.com/$githubOrg/${githubProject}.git")
} }
if (publish) project.addGithubPublishing(githubOrg, githubProject)
if (release) linkPublicationsToReleaseTask("github")
} }
private val releaseTask by lazy { private val releaseTask by lazy {
@ -54,18 +82,15 @@ class KSciencePublishingExtension(val project: Project) {
} }
/** /**
* Space publishing * Adds Space Packages Maven repository to publishing.
*
* @param spaceRepo the repository URL.
* @param release whether publish packages in the `release` task to the Space repository.
*/ */
fun space(spaceRepo: String = "https://maven.pkg.jetbrains.space/mipt-npm/p/sci/maven", publish: Boolean = false) { public fun space(spaceRepo: String = "https://maven.pkg.jetbrains.space/mipt-npm/p/sci/maven", release: Boolean = true) {
require(initializedFlag) { "The project vcs is not set up use 'vcs' method to do so" }
project.addSpacePublishing(spaceRepo) project.addSpacePublishing(spaceRepo)
if (publish) if (release) linkPublicationsToReleaseTask("space")
project.afterEvaluate {
allTasks()
.find { it.name == "publish${publicationTarget}ToSpaceRepository" }
?.let { publicationTask -> releaseTask?.dependsOn(publicationTask) }
}
} }
// // Bintray publishing // // Bintray publishing
@ -75,25 +100,23 @@ class KSciencePublishingExtension(val project: Project) {
// var bintrayRepo: String? by project.extra // var bintrayRepo: String? by project.extra
/** /**
* Sonatype publishing * Adds Sonatype Maven repository to publishing.
*
* @param release whether publish packages in the `release` task to the Sonatype repository.
*/ */
fun sonatype(publish: Boolean = true) { public fun sonatype(release: Boolean = true) {
require(initializedFlag) { "The project vcs is not set up use 'vcs' method to do so" } require(isVcsInitialized) { "The project vcs is not set up use 'git' method to do so" }
project.addSonatypePublishing() project.addSonatypePublishing()
if (publish) if (release) linkPublicationsToReleaseTask("sonatype")
project.afterEvaluate {
allTasks()
.find { it.name == "publish${publicationTarget}ToSonatypeRepository" }
?.let { publicationTask -> releaseTask?.dependsOn(publicationTask) }
}
} }
} }
/** /**
* Apply extension and repositories * Applies third-party plugins (Dokka, Changelog, binary compatibility validator); configures Maven publishing, README
* generation.
*/ */
open class KScienceProjectPlugin : Plugin<Project> { public open class KScienceProjectPlugin : Plugin<Project> {
override fun apply(target: Project): Unit = target.run { override fun apply(target: Project): Unit = target.run {
apply<ChangelogPlugin>() apply<ChangelogPlugin>()
@ -143,7 +166,8 @@ open class KScienceProjectPlugin : Plugin<Project> {
} }
} }
} }
tasks.withType<DokkaTask> {
tasks.withType<AbstractDokkaTask> {
dependsOn(generateReadme) dependsOn(generateReadme)
} }
} }
@ -231,7 +255,7 @@ open class KScienceProjectPlugin : Plugin<Project> {
} }
} }
companion object { public companion object {
const val RELEASE_GROUP = "release" public const val RELEASE_GROUP: String = "release"
} }
} }

View File

@ -3,10 +3,10 @@ package ru.mipt.npm.gradle
import groovy.text.SimpleTemplateEngine import groovy.text.SimpleTemplateEngine
import kotlinx.validation.ApiValidationExtension import kotlinx.validation.ApiValidationExtension
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.*
import java.io.File import java.io.File
enum class Maturity { public enum class Maturity {
PROTOTYPE, PROTOTYPE,
EXPERIMENTAL, EXPERIMENTAL,
DEVELOPMENT, DEVELOPMENT,
@ -14,16 +14,17 @@ enum class Maturity {
} }
class KScienceReadmeExtension(val project: Project) { public class KScienceReadmeExtension(public val project: Project) {
var description: String = project.description ?: "" public var description: String = project.description ?: ""
var maturity: Maturity = Maturity.EXPERIMENTAL
public var maturity: Maturity = Maturity.EXPERIMENTAL
set(value) { set(value) {
field = value field = value
val projectName = project.name val projectName = project.name
if (value == Maturity.EXPERIMENTAL || value == Maturity.PROTOTYPE) { if (value == Maturity.EXPERIMENTAL || value == Maturity.PROTOTYPE) {
project.rootProject.run { project.rootProject.run {
plugins.withId("org.jetbrains.kotlinx.binary-compatibility-validator") { plugins.withId("org.jetbrains.kotlinx.binary-compatibility-validator") {
extensions.getByType<ApiValidationExtension>().apply { extensions.findByType<ApiValidationExtension>()?.apply {
project.logger.warn("$value project $projectName is excluded from API validation") project.logger.warn("$value project $projectName is excluded from API validation")
ignoredProjects.add(projectName) ignoredProjects.add(projectName)
} }
@ -32,18 +33,18 @@ class KScienceReadmeExtension(val project: Project) {
} }
} }
var readmeTemplate: File = project.file("docs/README-TEMPLATE.md") public var readmeTemplate: File = project.file("docs/README-TEMPLATE.md")
data class Feature(val id: String, val description: String, val ref: String?, val name: String = id) public data class Feature(val id: String, val description: String, val ref: String?, val name: String = id)
val features: MutableList<Feature> = ArrayList() public val features: MutableList<Feature> = ArrayList()
@Deprecated("Use lambda builder instead") @Deprecated("Use lambda builder instead.")
fun feature(id: String, description: String, ref: String? = null, name: String = id) { public fun feature(id: String, description: String, ref: String? = null, name: String = id) {
features += Feature(id, description, ref, name) features += Feature(id, description, ref, name)
} }
fun feature(id: String, ref: String? = null, name: String = id, description: () -> String) { public fun feature(id: String, ref: String? = null, name: String = id, description: () -> String) {
features += Feature(id, description(), ref, name) features += Feature(id, description(), ref, name)
} }
@ -54,25 +55,25 @@ class KScienceReadmeExtension(val project: Project) {
"features" to { featuresString() } "features" to { featuresString() }
) )
val actualizedProperties public val actualizedProperties: Map<String, Any?>
get() = properties.mapValues { (_, value) -> value() } get() = properties.mapValues { (_, value) -> value() }
fun property(key: String, value: Any?) { public fun property(key: String, value: Any?) {
properties[key] = { value } properties[key] = { value }
} }
fun property(key: String, value: () -> Any?) { public fun property(key: String, value: () -> Any?) {
properties[key] = value properties[key] = value
} }
fun propertyByTemplate(key: String, template: String) { public fun propertyByTemplate(key: String, template: String) {
val actual = actualizedProperties val actual = actualizedProperties
properties[key] = { SimpleTemplateEngine().createTemplate(template).make(actual).toString() } properties[key] = { SimpleTemplateEngine().createTemplate(template).make(actual).toString() }
} }
internal val additionalFiles = ArrayList<File>() internal val additionalFiles = ArrayList<File>()
fun propertyByTemplate(key: String, template: File) { public fun propertyByTemplate(key: String, template: File) {
val actual = actualizedProperties val actual = actualizedProperties
properties[key] = { SimpleTemplateEngine().createTemplate(template).make(actual).toString() } properties[key] = { SimpleTemplateEngine().createTemplate(template).make(actual).toString() }
additionalFiles += template additionalFiles += template
@ -81,7 +82,7 @@ class KScienceReadmeExtension(val project: Project) {
/** /**
* Generate a markdown string listing features * Generate a markdown string listing features
*/ */
fun featuresString(itemPrefix: String = " - ", pathPrefix: String = "") = buildString { public fun featuresString(itemPrefix: String = " - ", pathPrefix: String = ""): String = buildString {
features.forEach { features.forEach {
appendLine("$itemPrefix[${it.name}]($pathPrefix${it.ref ?: "#"}) : ${it.description}") appendLine("$itemPrefix[${it.name}]($pathPrefix${it.ref ?: "#"}) : ${it.description}")
} }
@ -90,12 +91,10 @@ class KScienceReadmeExtension(val project: Project) {
/** /**
* Generate a readme string from the stub * Generate a readme string from the stub
*/ */
fun readmeString(): String? { public fun readmeString(): String? = if (readmeTemplate.exists()) {
return if (readmeTemplate.exists()) {
val actual = actualizedProperties val actual = actualizedProperties
SimpleTemplateEngine().createTemplate(readmeTemplate).make(actual).toString() SimpleTemplateEngine().createTemplate(readmeTemplate).make(actual).toString()
} else { } else {
null null
} }
} }
}

View File

@ -1,25 +1,32 @@
package ru.mipt.npm.gradle package ru.mipt.npm.gradle
import org.gradle.api.JavaVersion import org.gradle.api.JavaVersion
import org.tomlj.Toml
/** /**
* Build constants * Build constants
*/ */
object KScienceVersions { public object KScienceVersions {
const val kotlinVersion = "1.5.21"
const val kotlinxNodeVersion = "0.0.7"
const val coroutinesVersion = "1.5.1"
const val serializationVersion = "1.2.2"
const val atomicVersion = "0.16.2"
const val ktorVersion = "1.6.1"
const val htmlVersion = "0.7.3"
const val dateTimeVersion = "0.2.1"
const val jsBom = "0.0.1-pre.216-kotlin-1.5.20"
val JVM_TARGET = JavaVersion.VERSION_11 private val toml by lazy {
Toml.parse(javaClass.getResource("/libs.versions.toml")!!.readText())
}
object Serialization{ public val kotlinVersion: String get() = toml.getString("versions.kotlin")!!
const val xmlVersion = "0.82.0" public val kotlinxNodeVersion: String get() = toml.getString("versions.kotlinx-nodejs")!!
const val yamlKtVersion = "0.10.0" public val coroutinesVersion: String get() = toml.getString("versions.kotlinx-coroutines")!!
public val serializationVersion: String get() = toml.getString("versions.kotlinx-serialization")!!
public val atomicVersion: String get() = toml.getString("versions.atomicfu")!!
public val ktorVersion: String get() = toml.getString("versions.ktor")!!
public val htmlVersion: String get() = toml.getString("versions.kotlinx-html")!!
public val dateTimeVersion: String get() = toml.getString("versions.kotlinx-datetime")!!
public val jsBom: String get() = toml.getString("versions.jsBom")!!
public val JVM_TARGET: JavaVersion = JavaVersion.VERSION_11
public object Serialization {
public val xmlVersion: String get() = toml.getString("versions.xmlutil")!!
public val yamlKtVersion: String get() = toml.getString("versions.yamlkt")!!
} }
} }

View File

@ -3,58 +3,47 @@ package ru.mipt.npm.gradle
import org.gradle.api.Project import org.gradle.api.Project
import ru.mipt.npm.gradle.internal.useCommonDependency import ru.mipt.npm.gradle.internal.useCommonDependency
class SerializationTargets( public class SerializationTargets(
val sourceSet: DependencySourceSet, public val sourceSet: DependencySourceSet,
val configuration: DependencyConfiguration public val configuration: DependencyConfiguration,
) { ) {
public fun Project.json(
fun Project.json( version: String = KScienceVersions.serializationVersion,
version: String = KScienceVersions.serializationVersion ): Unit = useCommonDependency(
) {
useCommonDependency(
"org.jetbrains.kotlinx:kotlinx-serialization-json:$version", "org.jetbrains.kotlinx:kotlinx-serialization-json:$version",
dependencySourceSet = sourceSet, dependencySourceSet = sourceSet,
dependencyConfiguration = configuration dependencyConfiguration = configuration,
) )
}
fun Project.cbor( public fun Project.cbor(
version: String = KScienceVersions.serializationVersion version: String = KScienceVersions.serializationVersion,
) { ): Unit = useCommonDependency(
useCommonDependency(
"org.jetbrains.kotlinx:kotlinx-serialization-cbor:$version", "org.jetbrains.kotlinx:kotlinx-serialization-cbor:$version",
dependencySourceSet = sourceSet, dependencySourceSet = sourceSet,
dependencyConfiguration = configuration dependencyConfiguration = configuration,
) )
}
fun Project.protobuf( public fun Project.protobuf(
version: String = KScienceVersions.serializationVersion version: String = KScienceVersions.serializationVersion,
) { ): Unit = useCommonDependency(
useCommonDependency(
"org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$version", "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$version",
dependencySourceSet = sourceSet, dependencySourceSet = sourceSet,
dependencyConfiguration = configuration dependencyConfiguration = configuration,
) )
}
fun Project.xml( public fun Project.xml(
version: String = KScienceVersions.Serialization.xmlVersion version: String = KScienceVersions.Serialization.xmlVersion,
) { ): Unit = useCommonDependency(
useCommonDependency(
"io.github.pdvrieze.xmlutil:serialization:$version", "io.github.pdvrieze.xmlutil:serialization:$version",
dependencySourceSet = sourceSet, dependencySourceSet = sourceSet,
dependencyConfiguration = configuration dependencyConfiguration = configuration,
) )
}
fun Project.yamlKt( public fun Project.yamlKt(
version: String = KScienceVersions.Serialization.yamlKtVersion version: String = KScienceVersions.Serialization.yamlKtVersion,
) { ): Unit = useCommonDependency(
useCommonDependency(
"net.mamoe.yamlkt:yamlkt:$version", "net.mamoe.yamlkt:yamlkt:$version",
dependencySourceSet = sourceSet, dependencySourceSet = sourceSet,
dependencyConfiguration = configuration dependencyConfiguration = configuration,
) )
} }
}

View File

@ -11,19 +11,20 @@ import org.gradle.language.jvm.tasks.ProcessResources
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder
internal fun LanguageSettingsBuilder.applySettings(): Unit { internal fun LanguageSettingsBuilder.applySettings() {
languageVersion = "1.5" languageVersion = "1.6"
apiVersion = "1.5" apiVersion = "1.6"
progressiveMode = true progressiveMode = true
useExperimentalAnnotation("kotlin.Experimental")
useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes") optIn("kotlin.RequiresOptIn")
useExperimentalAnnotation("kotlin.ExperimentalStdlibApi") optIn("kotlin.ExperimentalUnsignedTypes")
useExperimentalAnnotation("kotlin.time.ExperimentalTime") optIn("kotlin.ExperimentalStdlibApi")
useExperimentalAnnotation("kotlin.contracts.ExperimentalContracts") optIn("kotlin.time.ExperimentalTime")
useExperimentalAnnotation("kotlin.js.ExperimentalJsExport") optIn("kotlin.contracts.ExperimentalContracts")
optIn("kotlin.js.ExperimentalJsExport")
} }
internal fun RepositoryHandler.applyRepos(): Unit { internal fun RepositoryHandler.applyRepos() {
mavenCentral() mavenCentral()
maven("https://repo.kotlin.link") maven("https://repo.kotlin.link")
} }
@ -50,8 +51,7 @@ internal fun Copy.fromJsDependencies(configurationName: String) = project.run {
} }
} }
internal fun KotlinMultiplatformExtension.bundleJsBinaryAsResource(bundleName: String = "js/bundle.js"){
fun KotlinMultiplatformExtension.bundleJsBinaryAsResource(bundleName: String = "js/bundle.js"){
js { js {
binaries.executable() binaries.executable()
browser { browser {

View File

@ -87,7 +87,6 @@ internal fun Project.useCommonDependency(
} }
} }
withPlugin("org.jetbrains.kotlin.jvm") { withPlugin("org.jetbrains.kotlin.jvm") {
configure<KotlinJvmProjectExtension> { configure<KotlinJvmProjectExtension> {
sourceSets.findByName(dependencySourceSet.setName)?.apply { sourceSets.findByName(dependencySourceSet.setName)?.apply {
@ -102,6 +101,7 @@ internal fun Project.useCommonDependency(
} }
} }
} }
withPlugin("org.jetbrains.kotlin.js") { withPlugin("org.jetbrains.kotlin.js") {
configure<KotlinJsProjectExtension> { configure<KotlinJsProjectExtension> {
sourceSets.findByName(dependencySourceSet.setName)?.apply { sourceSets.findByName(dependencySourceSet.setName)?.apply {

View File

@ -2,6 +2,7 @@ package ru.mipt.npm.gradle.internal
import org.apache.tools.ant.taskdefs.condition.Os import org.apache.tools.ant.taskdefs.condition.Os
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.findByType import org.gradle.kotlin.dsl.findByType
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
@ -10,7 +11,7 @@ import ru.mipt.npm.gradle.DependencyConfiguration
import ru.mipt.npm.gradle.FXModule import ru.mipt.npm.gradle.FXModule
import ru.mipt.npm.gradle.FXPlatform import ru.mipt.npm.gradle.FXPlatform
val defaultPlatform: FXPlatform = when { internal val defaultPlatform: FXPlatform = when {
Os.isFamily(Os.FAMILY_WINDOWS) -> FXPlatform.WINDOWS Os.isFamily(Os.FAMILY_WINDOWS) -> FXPlatform.WINDOWS
Os.isFamily(Os.FAMILY_MAC) -> FXPlatform.MAC Os.isFamily(Os.FAMILY_MAC) -> FXPlatform.MAC
Os.isFamily(Os.FAMILY_UNIX) -> FXPlatform.LINUX Os.isFamily(Os.FAMILY_UNIX) -> FXPlatform.LINUX

View File

@ -2,10 +2,12 @@ package ru.mipt.npm.gradle.internal
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPom
import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.bundling.Jar import org.gradle.api.tasks.bundling.Jar
import org.gradle.kotlin.dsl.* import org.gradle.kotlin.dsl.*
import org.gradle.plugins.signing.SigningExtension import org.gradle.plugins.signing.SigningExtension
import org.gradle.plugins.signing.SigningPlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
@ -16,52 +18,51 @@ private fun Project.requestProperty(propertyName: String): String = requestPrope
?: error("Property $propertyName not defined") ?: error("Property $propertyName not defined")
internal fun Project.setupPublication(vcs: String) = allprojects { internal fun Project.setupPublication(mavenPomConfiguration: MavenPom.() -> Unit = {}) = allprojects {
plugins.withId("maven-publish") { plugins.withId("maven-publish") {
configure<PublishingExtension> { configure<PublishingExtension> {
plugins.withId("org.jetbrains.kotlin.js") { plugins.withId("org.jetbrains.kotlin.js") {
val kotlin: KotlinJsProjectExtension = extensions.findByType()!! val kotlin: KotlinJsProjectExtension = extensions.findByType()!!
val sourcesJar: Jar by tasks.creating(Jar::class) { val sourcesJar by tasks.creating(Jar::class) {
archiveClassifier.set("sources") archiveClassifier.set("sources")
kotlin.sourceSets.forEach{
from(it.kotlin) kotlin.sourceSets.all {
from(kotlin)
} }
} }
afterEvaluate { afterEvaluate {
publications { publications.create<MavenPublication>("js") {
create("js", MavenPublication::class) {
kotlin.js().components.forEach { kotlin.js().components.forEach {
from(it) from(it)
} }
artifact(sourcesJar) artifact(sourcesJar)
} }
} }
} }
}
plugins.withId("org.jetbrains.kotlin.jvm") { plugins.withId("org.jetbrains.kotlin.jvm") {
val kotlin = extensions.findByType<KotlinJvmProjectExtension>()!! val kotlin = extensions.findByType<KotlinJvmProjectExtension>()!!
val sourcesJar: Jar by tasks.creating(Jar::class) { val sourcesJar by tasks.creating(Jar::class) {
archiveClassifier.set("sources") archiveClassifier.set("sources")
kotlin.sourceSets.forEach { kotlin.sourceSets.forEach {
from(it.kotlin) from(it.kotlin)
} }
} }
publications { publications.create<MavenPublication>("jvm") {
create("jvm", MavenPublication::class) {
kotlin.target.components.forEach { kotlin.target.components.forEach {
from(it) from(it)
} }
artifact(sourcesJar) artifact(sourcesJar)
} }
} }
}
val dokkaJar: Jar by tasks.creating(Jar::class) { val dokkaJar by tasks.creating(Jar::class) {
group = "documentation" group = "documentation"
archiveClassifier.set("javadoc") archiveClassifier.set("javadoc")
from(tasks.findByName("dokkaHtml")) from(tasks.findByName("dokkaHtml"))
@ -69,35 +70,35 @@ internal fun Project.setupPublication(vcs: String) = allprojects {
// Process each publication we have in this project // Process each publication we have in this project
afterEvaluate { afterEvaluate {
publications.withType<MavenPublication>().forEach { publication -> publications.withType<MavenPublication> {
publication.artifact(dokkaJar) artifact(dokkaJar)
publication.pom {
pom {
name.set(project.name) name.set(project.name)
description.set(project.description ?: project.name) description.set(project.description ?: project.name)
url.set(vcs)
licenses { licenses {
license { license {
name.set("The Apache Software License, Version 2.0") name.set("The Apache Software License, Version 2.0")
url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
distribution.set("repo") distribution.set("repo")
} }
} }
developers { developers {
developer { developer {
id.set("MIPT-NPM") id.set("MIPT-NPM")
name.set("MIPT nuclear physics methods laboratory") name.set("MIPT nuclear physics methods laboratory")
organization.set("MIPT") organization.set("MIPT")
organizationUrl.set("http://npm.mipt.ru") organizationUrl.set("https://npm.mipt.ru")
}
} }
}
scm { scm {
url.set(vcs)
tag.set(project.version.toString()) tag.set(project.version.toString())
//developerConnection = "scm:git:[fetch=]/*ВАША ССЫЛКА НА .git файл*/[push=]/*Повторить предыдущую ссылку*/"
} }
mavenPomConfiguration()
} }
} }
} }
@ -105,7 +106,7 @@ internal fun Project.setupPublication(vcs: String) = allprojects {
} }
} }
internal fun Project.isSnapshot() = version.toString().contains("dev") || version.toString().endsWith("SNAPSHOT") internal fun Project.isSnapshot() = "dev" in version.toString() || version.toString().endsWith("SNAPSHOT")
internal val Project.publicationTarget: String internal val Project.publicationTarget: String
get() { get() {
@ -137,10 +138,11 @@ internal fun Project.addGithubPublishing(
plugins.withId("maven-publish") { plugins.withId("maven-publish") {
configure<PublishingExtension> { configure<PublishingExtension> {
logger.info("Adding github publishing to project [${project.name}]") logger.info("Adding github publishing to project [${project.name}]")
repositories {
maven { repositories.maven {
name = "github" name = "github"
url = uri("https://maven.pkg.github.com/$githubOrg/$githubProject/") url = uri("https://maven.pkg.github.com/$githubOrg/$githubProject/")
credentials { credentials {
username = githubUser username = githubUser
password = githubToken password = githubToken
@ -150,13 +152,13 @@ internal fun Project.addGithubPublishing(
} }
} }
} }
}
internal fun Project.addSpacePublishing(spaceRepo: String) { internal fun Project.addSpacePublishing(spaceRepo: String) {
if (requestPropertyOrNull("publishing.enabled") != "true") { if (requestPropertyOrNull("publishing.enabled") != "true") {
logger.info("Skipping github publishing because publishing is disabled") logger.info("Skipping space publishing because publishing is disabled")
return return
} }
if (requestPropertyOrNull("publishing.space") == "false") { if (requestPropertyOrNull("publishing.space") == "false") {
logger.info("Skipping space publishing because `publishing.space == false`") logger.info("Skipping space publishing because `publishing.space == false`")
return return
@ -169,16 +171,15 @@ internal fun Project.addSpacePublishing(spaceRepo: String) {
plugins.withId("maven-publish") { plugins.withId("maven-publish") {
configure<PublishingExtension> { configure<PublishingExtension> {
project.logger.info("Adding mipt-npm Space publishing to project [${project.name}]") project.logger.info("Adding mipt-npm Space publishing to project [${project.name}]")
repositories {
maven { repositories.maven {
name = "space" name = "space"
url = uri(spaceRepo) url = uri(spaceRepo)
credentials { credentials {
username = spaceUser username = spaceUser
password = spaceToken password = spaceToken
} }
}
} }
} }
} }
@ -187,13 +188,15 @@ internal fun Project.addSpacePublishing(spaceRepo: String) {
internal fun Project.addSonatypePublishing() { internal fun Project.addSonatypePublishing() {
if (requestPropertyOrNull("publishing.enabled") != "true") { if (requestPropertyOrNull("publishing.enabled") != "true") {
logger.info("Skipping github publishing because publishing is disabled") logger.info("Skipping sonatype publishing because publishing is disabled")
return return
} }
if (isSnapshot()) { if (isSnapshot()) {
logger.info("Sonatype publishing skipped for dev version") logger.info("Sonatype publishing skipped for dev version")
return return
} }
if (requestPropertyOrNull("publishing.sonatype") == "false") { if (requestPropertyOrNull("publishing.sonatype") == "false") {
logger.info("Skipping sonatype publishing because `publishing.sonatype == false`") logger.info("Skipping sonatype publishing because `publishing.sonatype == false`")
return return
@ -201,32 +204,31 @@ internal fun Project.addSonatypePublishing() {
val sonatypeUser: String = requestProperty("publishing.sonatype.user") val sonatypeUser: String = requestProperty("publishing.sonatype.user")
val sonatypePassword: String = requestProperty("publishing.sonatype.password") val sonatypePassword: String = requestProperty("publishing.sonatype.password")
val signingId: String? = requestPropertyOrNull("publishing.signing.id")
allprojects { allprojects {
plugins.withId("maven-publish") { plugins.withId("maven-publish") {
configure<PublishingExtension> { configure<PublishingExtension> {
val sonatypeRepo: String = "https://oss.sonatype.org/service/local/staging/deploy/maven2" if (!plugins.hasPlugin("signing")) {
apply<SigningPlugin>()
if (plugins.findPlugin("signing") == null) {
plugins.apply("signing")
} }
extensions.configure<SigningExtension>("signing") { extensions.configure<SigningExtension>("signing") {
val signingId: String? = requestPropertyOrNull("publishing.signing.id")
if (!signingId.isNullOrBlank()) { if (!signingId.isNullOrBlank()) {
val signingKey: String = requestProperty("publishing.signing.key") val signingKey: String = requestProperty("publishing.signing.key")
val signingPassphrase: String = requestProperty("publishing.signing.passPhrase") val signingPassphrase: String = requestProperty("publishing.signing.passPhrase")
// if key is provided, use it // if key is provided, use it
@Suppress("UnstableApiUsage")
useInMemoryPgpKeys(signingId, signingKey, signingPassphrase) useInMemoryPgpKeys(signingId, signingKey, signingPassphrase)
} // else use file signing } // else use file signing
sign(publications) sign(publications)
} }
repositories { repositories.maven {
maven { val sonatypeRepo = "https://oss.sonatype.org/service/local/staging/deploy/maven2"
name = "sonatype" name = "sonatype"
url = uri(sonatypeRepo) url = uri(sonatypeRepo)
credentials { credentials {
username = sonatypeUser username = sonatypeUser
password = sonatypePassword password = sonatypePassword
@ -236,10 +238,3 @@ internal fun Project.addSonatypePublishing() {
} }
} }
} }
}
//internal val Project.bintrayPublish: Boolean
// get() = (findProperty("publishing.bintray.publish") as? String)?.toBoolean() ?: false
//internal val Project.bintrayOrg: String? get() = findProperty("publishing.bintray.org") as? String
//internal val Project.bintrayUser: String? get() = findProperty("publishing.bintray.user") as? String
//internal val Project.bintrayApiKey: String? get() = findProperty("publishing.bintray.apiKey") as? String

View File

@ -0,0 +1,10 @@
package ru.mipt.npm.gradle
import org.junit.jupiter.api.Test
class TestPlugins {
@Test
fun testVersions() {
println(KScienceVersions.coroutinesVersion)
}
}