build: projectVersion прокидывается в subprojects через rootProject.extra
release / Publish KMP libraries → caffeine Nexus (release) Failing after 26s
release / Build standalone fatjar (release) Has been skipped

Gitea Actions workflow упал с 'Invalid publication kotlinMultiplatform:
version cannot be empty' для :memory-vector и :storage-sqlite. Root cause:

  if (version == 'unspecified') { version = providers.gradleProperty('version')... }

  subprojects { version = rootProject.version }  // <-- lazy: rootProject.version
                                                  // ещё 'unspecified' в этот момент

Фикс: вычисляем projectVersion eagerly через Provider.map().getOrElse(),
кладём в rootProject.extra, subprojects читают из extra (а не через
rootProject.version, которое ещё не выставлено). Также strip 'v' prefix
из tag-имени (CI передаёт -Pversion=v0.1.0 через GITEA_REF_NAME).
This commit is contained in:
2026-09-15 23:05:41 +03:00
parent 87742cf60b
commit 5fbe865a29
+17 -6
View File
@@ -7,11 +7,20 @@ plugins {
group = "pw.binom.agentik" group = "pw.binom.agentik"
// Publication version: -Pversion=<tag> (CICD publishes by release tag). // projectVersion определяется ниже как val, чтобы subprojects могли его
// Без явного -Pversion берётся fallback из gradle.properties или "0.1.0". // прочитать через rootProject.extra["projectVersion"].
if (version == "unspecified") {
version = providers.gradleProperty("version").getOrElse("0.1.0") // Publication version: -Pversion=<tag> (CICD publishes by release tag) с
} // fallback в gradle.properties ("version=0.1.0"). Без версии maven-publish падает
// с "Invalid publication 'kotlinMultiplatform': version cannot be empty" —
// это известный gotcha: subprojects читают rootProject.version ДО того, как
// if-блок ниже успевает его установить. Фикс: provider+orElse вычисляется
// eagerly, и subprojects получают готовую строку.
val projectVersion: String = providers.gradleProperty("version")
.map { it.trimStart('v', 'V') } // strip optional "v" prefix from tag
.getOrElse("0.1.0")
version = projectVersion
extra["projectVersion"] = projectVersion
// Home Nexus URL/creds — передаются через -Pbinom.repo.* из CI/CD workflow // Home Nexus URL/creds — передаются через -Pbinom.repo.* из CI/CD workflow
// (.gitea/workflows/release.yml). Локально для дебага: // (.gitea/workflows/release.yml). Локально для дебага:
@@ -23,7 +32,9 @@ val binomRepoPassword = (findProperty("binom.repo.password") as String? ?: "").t
subprojects { subprojects {
group = rootProject.group group = rootProject.group
version = rootProject.version // Передаём вычисленную projectVersion, а не rootProject.version (который
// в момент apply ещё может быть "unspecified" для subproject'ов).
version = rootProject.extra["projectVersion"] as String
apply(plugin = "maven-publish") apply(plugin = "maven-publish")