- PVSM.RU - https://www.pvsm.ru -

Из JCenter в Maven или короткая заметка о публикации мультиплатформы Kotlin

Недавно появилась новость о том, что JCenter скоро будет закрыт [1] и как нам дальше жить там не сказано надо бы переезжать куда-то ещё. Лично для меня главным кандидатом стал MavenCentral, поскольку я уже давно там публикуюсь, хотя последний год привык делать это через Bintray. В этой заметке будет краткая информация о подводных, с которыми я встретился и как пришлось поменять свои скрипты публикации.

В ЭТОЙ СТАТЬЕ НЕТ ИНФОРМАЦИИ О ПУБЛИКАЦИИ НАТИВНЫХ ТАРГЕТОВ. И тем не менее, надеюсь, информация в статье будет вам полезна.

Наверно, уже писали

Действительно, есть несколько статей на эту тему (2019 [2] года и 2021 [3]), но на данный момент я не видел ни одной полноценной статьи с информацией о скриптах публикации (наверное, просто не туда смотрел). Большую часть информации можно взять из статьи (регистрация в Sonatype, регистрация домена, создание GPG ключа и его назначение и не только). Далее представлен универсальный скрипт публикации мультиплатформенного проекта:

apply plugin: 'maven-publish'
apply plugin: 'signing'

task javadocsJar(type: Jar) { // нужно, чтобы javadocs точно были включены в публикацию
    classifier = 'javadoc'
}

publishing {
    publications.all {
        artifact javadocsJar

        pom {
            description = "Ваше описание проекта"
            name = "${project.name}"
            url = "https://github.com/Owner/Project" // здесь обычная ссылка на проект, может быть и не github

            scm {
                developerConnection = "scm:git:[fetch=]/*ВАША ССЫЛКА НА .git файл*/[push=]/*Повторить предыдущую ссылку*/"
                url = "/*Ещё раз повторить предыдущую ссылку*/"
            }

            developers {
                    developer {
                        id = "ID разработчика"
                        name = "Имя разработчика"
                        email = "email разработчика"
                    }
            }

            licenses {
                    license {
                        name = "Имя лицензии"
                        url = "Ссылка на LICENSE файл"
                    }
                
            }
        }
        
        repositories {
            // тут только Maven Central
            maven {
                name = "sonatype"
                url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
                credentials {
                    username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER')
                    password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD')
                }
            }
        }
    }
}

signing {
    useGpgCmd()
    sign publishing.publications
}

Вы можете посмотреть на пример этого скрипта тут [4]. Во время переезда с JCenter я встретился со следующими ошибками:

  • maven url должен присваиваться именно uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")

  • Подпись должна производиться именно для publishing.publications (у меня раньше подписывась каждая публикация отдельно, отчего Java таргеты (включая Android) не получали свои подписи)

Публикация

Перед публикацией не забудьте предоставить в gradle переменные SONATYPE_USER и SONATYPE_PASSWORD. Это можно сделать несколькими способами:

  • Положить их в ~/.gradle/gradle.properties как обычные переменные

  • Экспортировать их перед публикацией в терминале (как это обычно делается в CI билдах)

Можно почитать в статьях в начале о том, как это сделать. Для публикации следует использовать следующий вызов:

$ ./gradlew --no-parallel publishAllPublicationsToSonatypeRepository

--no-parallel тут используется по той причине, что если у вас используется параллельное построение проекта (флаг --parallel или org.gradle.parallel=true в gradle.properties), то без флага отключения параллельного построения публикация будет произведена в несколько репозиториев, что может повлечь за собой невозможность закрыть и опубликовать релизы (об этом тоже писалось в статьях выше).

Вместо заключения

Публикация библиотеки - штука сложная, а потому я искренне желаю вам удачи на этом поприще. Если есть замечания/дополнения или ещё что-то, что может помочь другим - пишите в комментариях, чтобы я добавил об этом заметку в статью. Всего хорошего.

Автор: Алексей Овсянников

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/kotlin/361373

Ссылки в тексте:

[1] появилась новость о том, что JCenter скоро будет закрыт: https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/

[2] 2019: https://blog.autsoft.hu/publishing-an-android-library-to-mavencentral-in-2019/

[3] 2021: https://getstream.io/blog/publishing-libraries-to-mavencentral-2021/

[4] тут: https://github.com/InsanusMokrassar/MicroUtils/blob/master/publish.gradle

[5] Источник: https://habr.com/ru/post/541142/?utm_source=habrahabr&utm_medium=rss&utm_campaign=541142