基于bintray-release上传指定文件到Jcenter

一、介绍

在看这篇文章之前,你可能已经将自己的jar或者aar上传到jcenter,甚至已经使用过Novada bintray-release。
在这里我们不讨论怎么上传,只讨论bintray-release存在的缺陷。
那就是不能指定的目录或者文件

如果我们的jar或者aar需要用proguard混淆,那么如何上传混淆过的Jar ?
针对此问题,我们需要修改bintray-release。

二、目标

上传指定目录内的文件(比如Proguard混淆生成的Jar或Aar)。

三、具体实现

上传Jcenter,我们知道需要一个Source Jar,一个 JavaDoc,一个Pom文件,可选项[Aar]
简单读一下源码,我们首先了解一下大概结构。

3.1 我们要知道bintray-release为Android Studio的一个插件。
而每一个自定义的Plugin都需要实现Plugin接口,这个也是整个逻辑的入口。
由此可知ReleasePlugin便是整个入口。

3.2 PublishExtension是用户接触的DSL接口。

3.3 PropertyFinderPublishExtension的具体实现

3.4 AndroidArtifacts为Source包的实现。

以上几个文件便是我们主要修改的地方。
首先在PublishExtension新增两个参数:

//start archivesPath aaron
    // 路径
    String archivesPath = ''
    //关键字
    String archivesName = ''
    //end

其次,在PropertyFinder内新增两个获取具体Jar的函数。

//start archivesPath aaron
    FileCollection getArchives() {
        getFiles(project, 'archivesPath', extension.archivesPath, extension.archivesName)
    }

    private FileCollection getFiles(Project project, String propertyName, String archivePath, String archiveName) {
        def path = project.hasProperty(propertyName) ? project.getProperty(propertyName) : archivePath
        if (path) {
            if (archiveName != null) {
                return project.fileTree(dir: path).filter {
                    (it.name.endsWith(FILE_EXTENSION_JAR) || it.name.endsWith(FILE_EXTENSION_AAR)) &&
                            isNameContains(it, archiveName)
                }
            } else if (extension.artifactId != null) {
                return project.fileTree(dir: path).filter {
                    (it.name.endsWith(FILE_EXTENSION_JAR) || it.name.endsWith(FILE_EXTENSION_AAR)) &&
                            isNameContains(it, extension.artifactId)
                }
            } else {
                return project.fileTree(dir: path).filter {
                    it.name.endsWith(FILE_EXTENSION_JAR) || it.name.endsWith(FILE_EXTENSION_AAR)
                }
            }
        } else {
            return null
        }
    }

    private static boolean isNameContains(File file, String archiveName) {
        return file.name.substring(0, file.name.length() - FILE_EXTENSION_JAR.length()).contains(archiveName)
    }
    //end

最后,在AndroidArtifacts,修改all()函数如下:

    //start archivesPath aaron
    def all(String publicationName, Project project) {
        PropertyFinder propertyFinder = new PropertyFinder(project, project.publish)
        if (propertyFinder.getArchives() != null && propertyFinder.getArchives().size() > 0) {
            def archive = propertyFinder.getArchives().asList()
            archive.add(javadocJar(project))
            return archive
        } else {
            [sourcesJar(project), javadocJar(project), mainJar(project)]
        }

    }
    //end

具体代码可参考GitHub

四、使用方法

在publish内新增archivesPath参数,可将指定的jar包或者aar包放在此目录下,会指定上传此目录内的压缩包。这样我们便可以很容易上传自己生成的jar,比如混淆过的。

4.1新增依赖

4.1.1 根目录下的build.gradle中加入上传开源库的依赖:

classpath 'com.aaron.gradle:bintray-release:1.3.1'

4.1.2 library的module中加入 apply

apply plugin: 'com.aaron.gradle.bintray-release'

4.2简单使用

利用 publish 闭包完成相应设置:

publish {
    userOrg = 'novoda'
    groupId = 'com.novoda'
    artifactId = 'bintray-release'
    publishVersion = '0.3.4'
    archivesPath = '../build/outputs' //指定将要上传的压缩包路径,如果不写则默认上传系统生成的jar和aar
    archivesName = 'bintray-release'  //指定将要上传的压缩包所含的关键字,如果不写,默认过滤artifactId
    desc = 'Oh hi, this is a nice description for a project, right?'
    website = 'https://github.com/snailflying/bintray-release'
}

最后,利用 task bintrayUpload 完成上传 (确保已提前在指定位置生成了相应jar包!):

$ ./gradlew bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false

4.3常见错误排除

4.3.1 如果你开源库中有中文注释在module的build.gradle加入格式

allprojects {
    repositories {
        jcenter()
    }
    //加上这些
    tasks.withType(Javadoc) {
        options{ encoding "UTF-8"
            charSet 'UTF-8'
            links "http://docs.oracle.com/javase/7/docs/api"
        }
    }
}

根目录下的build.gradle中增加

tasks.getByPath(":library模块:releaseAndroidJavadocs").enabled = false

4.3.2 忽略错误信息:module的build.gradle

android {
 lintOptions {
        abortOnError false
    }
}

源码地址:GitHub

你可能感兴趣的:(基于bintray-release上传指定文件到Jcenter)