美文网首页
基于bintray-release上传指定文件到Jcenter

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

作者: 进击的小强 | 来源:发表于2018-06-12 21:46 被阅读71次

    一、介绍

    在看这篇文章之前,你可能已经将自己的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<T>接口,这个也是整个逻辑的入口。
    由此可知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

          本文链接:https://www.haomeiwen.com/subject/foiosftx.html