Kotlin Multiplatform 라이브러리를 Maven Central에 게시

18312 단어 multiplatformkotlin
현재, 우리가 첫 번째 Kotlin 멀티플랫폼 라이브러리를 구축하고 멀티플랫폼 라이브러리 발표 형식을 이해한 후에, 우리가 라이브러리를 공개하고 Maven Central에 발표하는 것을 막을 수 있는 것은 아무것도 없다.

Sonatype 계정 등록


만약 이것이 첫 번째 라이브러리이거나, 이전에 Bintray만 사용해서 이 작업을 완성한 적이 있다면, 먼저 Sonatype 계정을 등록해야 합니다.
인터넷에는 많은 글들이 등록 과정을 묘사하였다.The one from GetStream는 상세하고 최신이다."GPG 키 쌍 생성"을 비롯하여 다음 네 가지 단계를 시작할 수 있습니다.
  • Sonatype을 사용하여 Jira 계정을 등록합니다my issue.✅
  • GitHub repo를 생성하여 가공소재를 게시할 그룹 ID에 대한 소유권을 검증합니다.✅
  • 가공소재 서명을 위한 GPG 키 쌍을 생성합니다.✅
  • 공개 키를 게시합니다.✅
  • 개인 키를 내보냅니다.✅
  • Maven 저장소와 라이브러리의 서명 키가 준비되면 우리는 계속 전진할 수 있습니다. 그리고 우리의 구축을 설정하고 라이브러리 부품을 임시 저장소에 업로드한 다음에 발표할 수 있습니다.

    게시 작성


    지금 우리는Gradle에게 우리의 라이브러리를 어떻게 발표하는지 알려줘야 한다.대부분의 작업은 maven-publish 과 Kotlin Gradle 플러그인으로 이루어졌습니다. 필요한 모든 출판물은 자동으로 만들어집니다.라이브러리를 로컬 Maven 저장소에 게시할 때 결과가 표시됩니다.하지만 Maven Central에 게시하려면 몇 가지 추가 절차가 필요합니다.
  • 공용 Maven 저장소 URL과 자격 증명을 구성합니다.
  • 모든 라이브러리 구성 요소에 대한 설명과 javadocs을 제공합니다.
  • 출판물에 서명하다.
  • Gradle 스크립트를 작성해서 이 모든 작업을 처리합시다!나는 우리의 라이브러리 모듈 구축에서 출판물과 관련된 모든 논리를 추출할 것을 건의합니다.나중에 다른 모듈에서 쉽게 사용할 수 있도록 스크립트를 작성합니다.
    가장 익숙하고 유연한 방법은 사용Gradle’s precompiled script plugins이다.빌드 논리는 사전 컴파일 스크립트 플러그인으로 제공되며 플러그인 ID를 통해 라이브러리의 각 모듈에 적용될 수 있습니다.
    이를 위해서는 발표 논리를 개별적인Gradle 프로젝트에 두어야 합니다.
  • convention-plugins 중에convention-plugins가 있다.

  • 다음을 build.gradle.kts에 넣습니다.
    plugins {
        `kotlin-dsl` // Is needed to turn our build logic written in Kotlin into Gralde Plugin
    }
    
    repositories {
        gradlePluginPortal() // To use 'maven-publish' and 'signing' plugins in our own plugin
    }
    
  • build.gradle.kts 디렉터리에 convention.publication.gradle.kts 파일을 만듭니다.이것은 모든 발표 논리를 저장하는 곳이다.

  • 필요한 모든 논리를 거기에 두어라.애플리케이션convention-plugins/src/main/kotlin만으로도 로컬 Maven 저장소에 게시할 수 있지만 Maven Central에는 게시할 수 없습니다.제공된 스크립트에서는 maven-publish 또는 환경 변수에서 자격 증명을 얻어 게시 섹션에서 필요한 모든 구성을 수행하고 서명 플러그인을 사용하여 출판물에 서명합니다.
    import org.gradle.api.publish.maven.MavenPublication
    import org.gradle.api.tasks.bundling.Jar
    import org.gradle.kotlin.dsl.`maven-publish`
    import org.gradle.kotlin.dsl.signing
    import java.util.*
    
    plugins {
       `maven-publish`
       signing
    }
    
    // Stub secrets to let the project sync and build without the publication values set up
    ext["signing.keyId"] = null
    ext["signing.password"] = null
    ext["signing.secretKeyRingFile"] = null
    ext["ossrhUsername"] = null
    ext["ossrhPassword"] = null
    
    // Grabbing secrets from local.properties file or from environment variables, which could be used on CI
    val secretPropsFile = project.rootProject.file("local.properties")
    if (secretPropsFile.exists()) {
       secretPropsFile.reader().use {
           Properties().apply {
               load(it)
           }
       }.onEach { (name, value) ->
           ext[name.toString()] = value
       }
    } else {
       ext["signing.keyId"] = System.getenv("SIGNING_KEY_ID")
       ext["signing.password"] = System.getenv("SIGNING_PASSWORD")
       ext["signing.secretKeyRingFile"] = System.getenv("SIGNING_SECRET_KEY_RING_FILE")
       ext["ossrhUsername"] = System.getenv("OSSRH_USERNAME")
       ext["ossrhPassword"] = System.getenv("OSSRH_PASSWORD")
    }
    
    val javadocJar by tasks.registering(Jar::class) {
       archiveClassifier.set("javadoc")
    }
    
    fun getExtraString(name: String) = ext[name]?.toString()
    
    publishing {
       // Configure maven central repository
       repositories {
           maven {
               name = "sonatype"
               setUrl("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/")
               credentials {
                   username = getExtraString("ossrhUsername")
                   password = getExtraString("ossrhPassword")
               }
           }
       }
    
       // Configure all publications
       publications.withType<MavenPublication> {
    
           // Stub javadoc.jar artifact
           artifact(javadocJar.get())
    
           // Provide artifacts information requited by Maven Central
           pom {
               name.set("MPP Sample library")
               description.set("Sample Kotlin Multiplatform library (jvm + ios + js) test")
               url.set("https://github.com/KaterinaPetrova/mpp-sample-lib")
    
               licenses {
                   license {
                       name.set("MIT")
                       url.set("https://opensource.org/licenses/MIT")
                   }
               }
               developers {
                   developer {
                       id.set("KaterinaPetrova")
                       name.set("Ekaterina Petrova")
                       email.set("[email protected]")
                   }
               }
               scm {
                   url.set("https://github.com/KaterinaPetrova/mpp-sample-lib")
               }
    
           }
       }
    }
    
    // Signing artifacts. Signing.* extra properties values will be used
    
    signing {
       sign(publishing.publications)
    }
    

  • 너의 도서관 프로젝트로 돌아가라.Gradle을 사용하여 루트 디렉토리local.properties에 다음 내용을 추가하여 플러그인을 미리 구성합니다.
    includeBuild("convention-plugins")
    

  • 현재 우리는 우리의 라이브러리settings.gradle에서 이 논리를 응용할 수 있다.build.script 부분에서 사용plugins을 저희maven-publish로 바꿉니다.
    plugins {
       kotlin("multiplatform") version "1.4.30"
       id("convention.publication")
    }
    

  • 필요한 모든 자격 증명을 포함하는 conventional.publication 파일을 만들고 에 추가했는지 확인하는 것을 잊지 마십시오.gitignore🗝:
    signing.keyId=...
    signing.password=...
    signing.secretKeyRingFile=...
    ossrhUsername=...
    ossrhPassword=...
    
  • 현재 심호흡, 제작local.properties 및 동기화 프로젝트.

    Sonatype 저장소와 관련된 새Gradle 작업이 발표 그룹에 나타날 것입니다. 이것은 라이브러리를 발표할 수 있음을 의미합니다.

    Maven Central에 첫 번째 라이브러리 게시


    이 글의 첫머리에서, 나는 너에게 네가 클릭만 하면 너의 도서관을 발표할 수 있다는 것을 보증한다. 지금이 중요한 때이다.Sonatype 저장소에 라이브러리를 업로드하려면 다음과 같이 하십시오.
    ./gradlew publishAllPublicationsToSonatypeRepository
    
    이른바 임시 저장소를 만들고 모든 출판물의 모든 부품을 이 저장소에 업로드합니다.지금 해야 할 일은 업로드하고 싶은 모든 작업이 거기에 있는지 확인하고 '방출' 단추를 누르는 것입니다.
    이 마지막 절차는 the now-familiar article에 상세하게 설명되어 있다.요컨대, 당신은 다음과 같은 것을 필요로 한다.
  • 로 이동하여 Sonatype Jira에서 사용한 자격 증명으로 로그인합니다.
  • 저장소 준비 단계 섹션에서 저장소를 찾습니다.
  • 닫습니다.
  • 🚀 이거 놔!
  • Maven Central과 동기화를 활성화하기 위해 첫 번째 구성 요소를 발표했다는 것을 알려 주십시오.이 단계는 처음 릴리즈할 때만 필요합니다.
    https://s01.oss.sonatype.org/
    곧 라이브러리는 에서 사용할 수 있고 다른 개발자들은 의존항으로 추가할 수 있습니다.몇 시간만 지나면 https://repo1.maven.org/maven2/!
    discoverable in Maven Central Repository Search

    결론


    축하합니다!🎉 첫 번째 Kotlin 멀티플랫폼 라이브러리를 만들고 Maven Central에 발표했습니다!
    이제 릴리즈된 버전에 의존할 수 있는 방법은 다음과 같습니다.
    kotlin {
        android()
        ios ()
        sourceSets {
            val commonMain by getting {
                dependencies {
                    implementation("io.github.katerinapetrova:mpp-sample-lib:1.0.0")
                }
            }
    }
    
    아주 간단하죠?'외부 의존 항목' 부분을 보면, 프로젝트가 매번 모든 부품을 다운로드하는 것이 아니라 실제 목표 플랫폼의 부품만 다운로드하는 것을 발견할 수 있습니다.Gradle 모듈 메타데이터 기능 때문에 공유 원본에서 라이브러리에 대한 의존 관계를 한 번만 지정하면 됩니다. 설령 그것이 플랫폼 원본에서 집중적으로 사용되더라도.
    이미 많은 일을 했지만, 물론 이것은 여정의 시작일 뿐이다.다음으로 가장 흥미로운 부분은 라이브러리를 계속 지원하고 개선하는 것입니다. 그러면 사용자에게 가장 좋은 DX를 제공하고 다른 라이브러리 창설자와 공헌자와 함께 KMM 생태계를 발전시킬 수 있습니다.

    다음 단계에 유용한 절차

  • 현재 당신의 라이브러리를 Maven Central에 발표했으니 다른 사람에게 알려줄 때가 되었습니다. 당신의 프로젝트 자술에 나오는 것보다 더 좋은 방법이 뭐가 있겠습니까!
  • 라이브러리를 add a badge에 추가하여 발견성을 증가시킵니다.
  • 가능성the community-driven list of Kotlin Multiplatform libraries을 보고 지역 사회와 당신의 경험을 공유하세요. 만약 당신이 이 점을 성공적으로 해냈다면!
  • 게시 프로세스를 자동화하려면 / 카트리나 페트로바


    예제 Kotlin 멀티플랫폼 라이브러리(jvm+ios+js)

    좋은 웹페이지 즐겨찾기