使用Gradle釋出SNAPSHOT版本到JCenter(oss.jfrog.org)

浩碼農發表於2015-08-13

本文原創。
轉載請註明CSDN部落格出處:
http://blog.csdn.net/maosidiaoxian/article/details/47608573

在以前我發過一篇 使用Gradle釋出Android開源專案到JCenter ,但隨後釋出SNAPSHOT版本卻折騰了好久沒弄出來,而昨晚在參考了兩篇部落格後終於成功。

回顧歷史

在釋出 aar 到JCenter的時候,一開始指定上傳檔案的時候是使用publications,然後使用bundleRelease任務的輸出做為aar的artifact。

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId PROJ_ARTIFACTID
            artifact javadocJar
            artifact sourcesJar
            artifact bundleRelease
            //省略
        }
    }
}

bintray {
    user = BINTRAY_USER 
    key = BINTRAY_KEY

    publications = [`mavenJava`]
    // 省略
}

但是在當時卻導致了Android Studio裡編譯失敗,理由是沒有bundleRelease這個屬性(或任務)。其原因是,這個任務一開始的時候是沒有的,是在分析計算了build.gradle之後才建立的。
後來找到了一個迂迴的方法,那就是使用artifacts方法來把原始碼和註釋的jar包新增到artifact中,然後上傳的時候publicationsconfigurations一起用。如下:

artifacts {
    archives javadocJar
    archives sourcesJar
}
publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId PROJ_ARTIFACTID
            // 省略
    }
}
bintray {
    user = BINTRAY_USER 
    key = BINTRAY_KEY
    configurations = [`archives`]
    publications = [`mavenJava`]
    //省略
}

釋出SNAPSHOT版本的問題

首先參考了這篇部落格,知道如何傳上SNAPSHOT版本到oss.jfrog.org(JCenter是不支援SNAPSHOT版本的)。但是這裡卻只能用publications而不像bintray那樣有configurations

artifactory {
    contextUrl = `http://oss.jfrog.org/artifactory`
    resolve {
        repository {
            repoKey = `libs-release`
        }
    }
    publish {
        repository {
            repoKey = `oss-snapshot-local` //The Artifactory repository key to publish to
            username = bintray.user
            password = bintray.key
            maven = true
        }
        defaults {
//這裡的名字和上面紅色的名字一致即可,會將其包含的輸出上傳到jfrog上去
            publications(`mavenJava`)
            publishArtifacts = true
        }
    }
}

解決問題

於是只能再次面對以前那個問題,那就是怎麼解決打包輸出aar並加到mavenJava的配置中。先是找到一個github上的issue,老外用指定的檔案路徑來新增。stackoverflow上也有不少類似的答案。但這並不是我想要的,因為這樣的指定並不靈活,而且也沒有對打包aar的任務形成依賴,所以最後還是迴歸到如何解決在配置中新增bundleRelease的問題上。google之後,終於在小日本的這篇部落格找到答案:

afterEvaluate {
    publishing.publications.aar.artifact(bundleRelease)
    publishing.publications.jar.artifact(packageReleaseJar)
}

即,使用afterEvaluate,在這裡的閉包中進行新增。因為在這個時候,已經有bundleRelease這個任務了。

完整指令碼

完整指令碼如下:

group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID

apply plugin: `com.jfrog.bintray`
apply plugin: "com.jfrog.artifactory"
apply plugin: `maven-publish`

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = `sources`
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += configurations.compile
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = `javadoc`
    from javadoc.destinationDir
}

javadoc {
    options{
        encoding "UTF-8"
        charSet `UTF-8`
        author true
        version true
        links "http://docs.oracle.com/javase/7/docs/api"
        title PROJ_ARTIFACTID
    }
}


def pomConfig = {
    licenses {
        license {
            name "The Apache Software License, Version 2.0"
            url "http://www.apache.org/licenses/LICENSE-2.0.txt"
            distribution "repo"
        }
    }
    developers {
        developer {
            id DEVELOPER_ID
            name DEVELOPER_NAME
            email DEVELOPER_EMAIL
        }
    }
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId PROJ_ARTIFACTID
            artifact javadocJar
            artifact sourcesJar

            pom{
                packaging `aar`
            }
            pom.withXml {
                def root = asNode()
                root.appendNode(`description`, PROJ_DESCRIPTION)
                root.children().last() + pomConfig
            }
        }
    }
}

afterEvaluate {
    publishing.publications.mavenJava.artifact(bundleRelease)
}

bintray {
    user = hasProperty("bintrayUser")?getProperty("bintrayUser"):getProperty("BINTRAY_USER") 
    key = hasProperty("bintrayKey")?getProperty("bintrayKey"):getProperty("BINTRAY_KEY")

    publications = [`mavenJava`]
    publish = true

    pkg {
        repo = `maven`
        name = PROJ_NAME
        desc = PROJ_DESCRIPTION
        websiteUrl = PROJ_WEBSITEURL
        issueTrackerUrl = PROJ_ISSUETRACKERURL
        vcsUrl = PROJ_VCSURL
        licenses = [`Apache-2.0`]
        publicDownloadNumbers = true
    }
}

artifactory {
    contextUrl = `http://oss.jfrog.org/artifactory`
    resolve {
        repository {
            repoKey = `libs-release`
        }
    }
    publish {
        repository {
            repoKey = `oss-snapshot-local` //The Artifactory repository key to publish to
            username = bintray.user
            password = bintray.key
            maven = true
        }
        defaults {
            //這裡的名字和上面紅色的名字一致即可,會將其包含的輸出上傳到jfrog上去
            publications(`mavenJava`)
            publishArtifacts = true
        }
    }
}

使用方法

使用方法與之前的一樣,這裡不多贅述。稍有區別的是,在build.gradle中需要新增多一個依賴:

    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"

這裡可以參考gradle-publish專案上的build.gradle檔案。
還有,釋出SNAPSHOT版本的時候,在配置裡的版本名稱應該是xxx.xxx.xxx-SNAPSHOT,執行gradle artifactoryPublish就可以釋出上去了。如果要使用,需要宣告以下倉庫:

    maven { url "http://oss.jfrog.org/oss-snapshot-local/" }

另外就是建議把bintray.gradle檔案拷到專案中使用。

如果使用過程有問題,歡迎在我的專案中提issue


相關文章