Flutter 混合开发maven方式打包

背景:

目前所有使用flutter的大项目一定是混合开发,所以flutter工程一定是以maven方式让大家使用才是最方便的,目前网上教程只有闲鱼有一些简单的介绍,对于想要自己使用来说,还需要完善很多细节,所以在此记录,方便后面使用。

打maven原因:1.公共库开发,maven导出让多个产品线使用才能达到最大效率利用

                            2.使用flutter开发的公共库,不可能让所有产品线都接入flutter项目与环境

 

操作:

步骤一:

        新建一个这个正常的android工程,这个跟flutter一点关系都没有

步骤二:

        在项目中新建一个flutter model        

Machbird xiepengchong$ flutter create -t module gamecenter

        PS:这时项目中应该有了一个gamecenter的flutter项目(gamecenter就是一个完整的可以直接运行的flutter工程,我们平时改的时候,只关注这个工程就可以了)

        

步骤三:

        在主工程的build.gradle中加上指定编译选项(flutter需要)

compileOptions {
         sourceCompatibility 1.8
         targetCompatibility 1.8
     }

步骤四:

        在主工程的settings.gradle 中加入

setBinding(new Binding([gradle:this]))
evaluate(new File(
        settingsDir,
        'mod_flutter/.android/include_flutter.groovy'

))

步骤五:

这时工程已经接入完成,剩下的就是上传maven的过程了,我写了两个文件,来达到上传maven的目的,

将下面两个文件拷贝到gamecenter/.android/Flutter 目录中

flutter_maven.gradle



apply plugin: MavenPlugin
apply from:'upload_maven.gradle'
class MavenPlugin implements Plugin<Project> {


    @Override
    void apply(Project target) {
        target.afterEvaluate {
            def scriptFile = target.rootDir
            def FlutterFile = new File(target.rootDir,"Flutter")
            def uploadFile = new File(FlutterFile,"upload_maven.gradle")
            def flutterProjectRoot = scriptFile.parentFile
            def plugins = new Properties()
            def pluginsFile = new File(flutterProjectRoot, '.flutter-plugins')
            if (pluginsFile.exists()) {
                pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
            }

            plugins.each { name, path ->

                def version = "1.0-SNAPSHOT"
                def folderName = new File(path).getName()
                if(folderName.contains("-")){
                    version = folderName.split("-")[1]+"-SNAPSHOT"  //每次更新flutter 插件都更新snapshot版本
//                    version = folderName.split("-")[1]
                }

                def properties = new Properties()

                def pluginDirectory = flutterProjectRoot.toPath().resolve(path).resolve('android').toFile()
                def propertiesFile = new File(pluginDirectory,'gradle.properties')
                def buildFile = new File(pluginDirectory,'build.gradle')


                def list = []
                buildFile.withReader('UTF-8') { reader ->
                    reader.eachLine {
                        if (it.contains('group ')) {
                            it = "group \'com.flutter.plugin\'"
                        } else if (it.contains('version ')) {
                            it = "version "+"\'"+version+"\'"
                        } else if (it.contains('apply plugin: \'com.android.library\'')) {
                            list.add('apply from:' + '\''+uploadFile.getPath()+ '\'' + "\n")
                        } else if(it.contains('apply from:' + '\''+uploadFile.getPath()+ '\'')){
                            it = ""
                        }
                        list.add(it + "\n")
                    }
                }
                buildFile.withWriter('UTF-8') { writer ->
                    list.each {
                        writer.write(it)
                    }
                }

                if (propertiesFile.exists()) {
                    propertiesFile.withReader('UTF-8') { reader -> properties.load(reader) }
                }


                properties.setProperty("GROUP","com.flutter.plugin")
                properties.setProperty("ARTIFACT_ID",name)
                properties.setProperty("VERSION_NAME",version)
                properties.store(new FileOutputStream(propertiesFile),"maven configuration");

            }
        }


    }
}




upload_maven.gradle


apply plugin: 'maven'

def getRepositoryUsername() {
    return hasProperty('MAVEN_USERNAME') ? MAVEN_USERNAME : ""
}
def getRepositoryPassword() {
    return hasProperty('MAVEN_PASSWORD') ? MAVEN_PASSWORD : ""
}
def getRepositoryUrl() {
    return !VERSION_NAME.toUpperCase().contains("SNAPSHOT") ? RELEASE_REPOSITORY_URL : SNAPSHOT_REPOSITORY_URL
}

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                pom.groupId = GROUP
                pom.artifactId = ARTIFACT_ID
                pom.version = VERSION_NAME
                repository(url: getRepositoryUrl()) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }
            }
        }
    }

    if (project.hasProperty("android")) { // Android libraries
        task flutterSourcesJar(type: Jar) {
            classifier = 'sources'
            from android.sourceSets.main.java.srcDirs
        }

    } else { // Java libraries
        task flutterSourcesJar(type: Jar, dependsOn: classes) {
            classifier = 'sources'
            from sourceSets.main.allSource
        }
    }


    artifacts {
        archives flutterSourcesJar
    }

    //解决 JavaDoc 中文注释生成失败的问题
    tasks.withType(Javadoc) {
        options.addStringOption('Xdoclint:none', '-quiet')
        options.addStringOption('encoding', 'UTF-8')
        options.addStringOption('charSet', 'UTF-8')
    }
    

步骤六:

在gamecenter/.android/Flutter/build.gradle目录中引入flutter_maven.gradle

apply from: "flutter_maven.gradle"

步骤七:

在gamecenter/.android/目录下编译工程

./gradlew clean assembleRelease     (第一次编译会将依赖的pub中增加版本号等信息,第二次才会编译成功)

./gradlew uploadArchives.  //上传maven

完成

到此完成了整个maven上传的整个流程,下面介绍一下原理

flutter工程会依赖很多的flutter的plugin,我们不仅仅需要将我们的工程打包成maven,还需要将依赖的所有plugin也打包成我们依赖的maven,所以我们需要做以下几件事:

1.找到所有的插件目录:

在根目录的.flutter-plugins中列举了所有的plugin(样式如下)

path_provider=/Users/xiepengchong/.pub-cache/hosted/http%58%47%47dev-flutter.apuscn.com/path_provider-0.5.0+1/
share=/Users/xiepengchong/.pub-cache/hosted/http%58%47%47dev-flutter.apuscn.com/share-0.6.1+1/
shared_preferences=/Users/xiepengchong/.pub-cache/hosted/http%58%47%47dev-flutter.apuscn.com/shared_preferences-0.5.2+1/
social_share_plugin=/Users/xiepengchong/Code/Company/Machbird/gamecenter/social_share_plugin/
sqflite=/Users/xiepengchong/.pub-cache/hosted/http%58%47%47dev-flutter.apuscn.com/sqflite-1.1.5/
video_player=/Users/xiepengchong/.pub-cache/hosted/http%58%47%47dev-flutter.apuscn.com/video_player-0.10.0+4/
youtube_player=/Users/xiepengchong/.pub-cache/hosted/http%58%47%47dev-flutter.apuscn.com/youtube_player-3.4.1/

上面不仅有名字,而且在本地的目录都介绍出来了,

2.将所有plugin都配置各自的版本

这就是在flutter_maven.gradle中做的事情,遍历每个目录,找到android 目录的gradle.properties文件,将你希望他使用的版本号传进入(最好是snapshot的),否则在每次上传主包的时候,需要单独加逻辑判断

 

3.让所有plugin都支持上传

都引入了upload_maven.gradle

经过上面三步就完成了让自己的flutter工程可以通过maven形式上传了

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值