From 5fbe865a292c605356b084cacdf8a61ff51b4cf0 Mon Sep 17 00:00:00 2001 From: subochev Date: Tue, 15 Sep 2026 23:05:41 +0300 Subject: [PATCH] =?UTF-8?q?build:=20projectVersion=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D0=B8=D0=B4=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B2=20subprojects=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20rootPro?= =?UTF-8?q?ject.extra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- build.gradle.kts | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 28b01dc..def4bc8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,11 +7,20 @@ plugins { group = "pw.binom.agentik" -// Publication version: -Pversion= (CICD publishes by release tag). -// Без явного -Pversion берётся fallback из gradle.properties или "0.1.0". -if (version == "unspecified") { - version = providers.gradleProperty("version").getOrElse("0.1.0") -} +// projectVersion определяется ниже как val, чтобы subprojects могли его +// прочитать через rootProject.extra["projectVersion"]. + +// Publication version: -Pversion= (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 // (.gitea/workflows/release.yml). Локально для дебага: @@ -23,7 +32,9 @@ val binomRepoPassword = (findProperty("binom.repo.password") as String? ?: "").t subprojects { group = rootProject.group - version = rootProject.version + // Передаём вычисленную projectVersion, а не rootProject.version (который + // в момент apply ещё может быть "unspecified" для subproject'ов). + version = rootProject.extra["projectVersion"] as String apply(plugin = "maven-publish")