美文网首页
Flutter项目如何一键上传aar至maven(Nexus)

Flutter项目如何一键上传aar至maven(Nexus)

作者: 晖仔Milo | 来源:发表于2023-11-16 18:48 被阅读0次

    首先,建议参考此文章
    https://cloud.tencent.com/developer/article/1912599

    在进入主题之前,请确保你的项目中已经包含Android + Java + Fluuter + Dart等开发环境,且已经懂得如何使用Fluuter的本地依赖。

    否则可以参考我的项目,先学会Android怎么配置Fluuter本地依赖:
    https://github.com/yanjunhui2014/FlutterApp
    https://github.com/yanjunhui2014/fz_flutter_share

    以上2个项目需要拷贝至同一级目录,而且由于Dart+FluuterSDK版本的原因,可能会有一些兼容问题需要调试。

    但如果满足以上条件,则可以继续往下。

    但是我在添加完packageHelper.sh并且执行之后,遇到如下问题。
    1、mvn指令不支持
    原因:没有安装Maven环境
    解决(mac电脑):https://wangxin1248.github.io/life/2020/02/mac-install-maven.html
    windows电脑自己去找下怎么安装maven+配置环境变量即可。

    2、修改配置后,执行packageHelper.sh,但是maven始终无法上传成功
    原因:


    image.png

    解决:
    可以自己手动赋值,推荐赋值规则如下
    例如你的maven地址是

    com.tencent.tinker:tinker-android-lib:0.0.1
    

    那么

    groupId="com.tencent.tinker"
    artificatId="tinker-android-lib"
    

    只是举一个例子,学会举一反三,不要生搬硬套

    3、改完之后,Nexus上能够查看到相应的maven库,但是,始终无法拉取成功,原因未知


    image.png

    当然,也有可能你运气好,这里就通过了。如果你遭遇和我一样,就继续往下看。

    分析来分析去,我也不知道是啥原因导致的。我就琢磨这packageHelper.sh到底是干啥的。好在代码不多,就凑合着看了看。发现它只做了2件事。

    第一、build aar。
    第二、上传aar。

    build aar肯定是不会有问题的,那就把重点放在上传上。
    我们来分析下.sh中的代码

    echo "aar打包完成,开始上传maven..."
    
    #方法 修改所有pom文件的名称
    function renameAllPomArtifactId() {
      find build/host/outputs/repo -name "*.pom" | while read -r file
      do
        sed -i -e "s/>$1</>$2</g" $file
      done
    }
    
    
    #第一次遍历repo文件夹下所有后缀名为.aar的文件
    find build/host/outputs/repo -name "*.aar" | while read -r file
    do
      #当前aar文件所在的目录
      currDirName=$(dirname $file)
      aarName=$file
      #当前aar文件对应的pom文件(aar和pom一一对应)
      pomName="$currDirName/$(basename $file .aar).pom"
    
      #从pom文件中读取出groupId信息
      groupId=$(awk '/<groupId>[^<]+</groupId>/{gsub(/<groupId>|</groupId>/,"",$1);print $1;exit;}' $pomName)
      #从pom文件中读取出artifactId信息,但是此时的artifactId并不是我们在properties中配置的,而是编译器自动生成的
      artifactId=$(awk '/<artifactId>[^<]+</artifactId>/{gsub(/<artifactId>|</artifactId>/,"",$1);print $1;exit;}' $pomName)
    
      #修改artifactId为在properties中配置的
      renameAllPomArtifactId $artifactId $projectName
    done
    
    #第二次遍历repo文件夹下所有后缀名为.aar的文件,为什么要二次遍历?
    #为了防止pom中的artifactId还没有全部修改完便被上传到maven引起的问题
    find build/host/outputs/repo -name "*.aar" | while read -r file
    do
      #当前aar文件所在的目录
      currDirName=$(dirname $file)
      aarName=$file
      #当前aar文件对应的pom文件(aar和pom一一对应)
      pomName="$currDirName/$(basename $file .aar).pom"
    
      #从pom文件中读取出groupId信息
      groupId=$(awk '/<groupId>[^<]+</groupId>/{gsub(/<groupId>|</groupId>/,"",$1);print $1;exit;}' $pomName)
      #从pom文件中读取出artifactId信息,此时已经修改为properties中配置的
      artifactId=$(awk '/<artifactId>[^<]+</artifactId>/{gsub(/<artifactId>|</artifactId>/,"",$1);print $1;exit;}' $pomName)
    
      echo "正在上传 = $aarName ..."
    

    可以看到,这一段代码中,有修改文件名的作用,那么我推测可能就是这个过程,导致我aar最终无法从maven上同步的原因。
    既然如此,那么就开干,把这一段代码删掉,然后做一定量适当的改写,看看能不能成功。

    下面贴上我写的 uploadMaven.sh

    注意

    /build/host/outputs/repo/com/example/ai_teacher_flutter_module/flutter_release
    一定要替换成你们自己的地址
    aarFile="$project_path/build/host/outputs/repo/com/example/ai_teacher_flutter_module/flutter_release/$buildVersion/flutter_release-$buildVersion.aar"
    pomFile="$project_path/build/host/outputs/repo/com/example/ai_teacher_flutter_module/flutter_release/$buildVersion/flutter_release-$buildVersion.pom"
    
    #!/bin/bash
    # shellcheck disable=SC2086
    # shellcheck disable=SC2001
    # shellcheck disable=SC2005
    # shellcheck disable=SC2016
    
    #引入配置文件
    PROPERTIES="package.properties"
    #maven依赖三要素
    packageNameV=""
    projectNameV=""
    buildVersionV=""
    
    #maven仓库地址
    mavenRepositoryV=""
    mavenSnapshotsV=""
    
    #是否为release版本
    isRelease=$1
    
    #当前使用的仓库,根据isRelease的不同而不同
    usedMavenRepo=""
    
    #读取配置文件信息并做容错处理
    if [ -f "$PROPERTIES" ]
    then
      . $PROPERTIES
      packageNameV=$packageName
      projectNameV=$projectName
      buildVersionV=$buildVersion
    
      if [ -z "$packageNameV" ]; then
          echo ERROR:"package.properties文件中没有配置packageName!"
          exit 1
      fi
    
      if [ -z "$projectNameV" ]; then
          echo ERROR:"package.properties文件中没有配置projectName!"
          exit 1
      fi
    
      if [ -z "$buildVersionV" ]; then
          echo ERROR:"package.properties文件中没有配置buildVersion!"
          exit 1
      fi
    
      mavenRepositoryV=$mavenRepository
      mavenSnapshotsV=$mavenSnapshots
    
      if [[ -z "$mavenRepositoryV" ]] && [[ -z "$mavenSnapshotsV" ]]
      then
        echo ERROR:"请检查是否在package.properties中正确配置了maven仓库信息!"
          exit 1
      fi
    else
      echo ERROR:"请先根据要求配置package.properties文件然后执行该脚本!"
      exit 1
    fi
    
    #打包前清理
    echo "flutter clear..."
    flutter clean
    
    #打包前获取依赖
    echo "flutter pub get..."
    flutter pub get
    
    echo "flutter pub get..."
    
    #根据isRelease执行不同的打包逻辑
    #if [ $isRelease = "true" ]
    #then
      #打包release版本,避免生成多余的包导致资源浪费,//--target-platform android-arm ,--no-profile --no-debug
      flutter build aar --build-number "$buildVersionV" --no-profile --no-debug
    #else
    #  #打包debug版本,避免生成多余的包导致资源浪费,//--target-platform android-arm , --no-profile --no-release
    #  flutter build aar --build-number "$buildVersionV" --no-profile --no-release
    #fi
    
    project_path=$(cd `dirname $0`; pwd)
    
    aarFile="$project_path/build/host/outputs/repo/com/example/ai_teacher_flutter_module/flutter_release/$buildVersion/flutter_release-$buildVersion.aar"
    pomFile="$project_path/build/host/outputs/repo/com/example/ai_teacher_flutter_module/flutter_release/$buildVersion/flutter_release-$buildVersion.pom"
    
    echo "打包完成"
    echo "打包指令 deploy:deploy-file -DgroupId=$packageName -DartifactId=$projectName -Dpackaging=aar Dversion=$buildVersionV Dfile=$aarFile DpomFile=$pomFile -Durl="
    
      #执行上传maven仓库命令
      mvn deploy:deploy-file \
      -DgroupId=$packageName \
      -DartifactId=$projectName \
      -Dpackaging=aar \
      -Dversion=$buildVersion \
      -Dfile=$aarFile \
      -DpomFile=$pomFile \
      -Durl=http://admin:admin123@10.10.1.211:8081/nexus/content/repositories/releases/
    
    finishEcho $packageNameV $projectName
    

    另外贴上package.properties

    projectName=flutter_release
    packageName=com.example.ai_teacher_flutter_module
    buildVersion=3.0
    mavenRepository=http://admin:admin123@youServerIp:8081/nexus/content/repositories/releases/
    mavenSnapshots=http://admin:admin123@youServerIp:8081/nexus/content/repositories/snapshots/
    

    然后:在项目终端(Terminal)中执行

    uploadMaven.sh
    

    若出现 zsh: permission denied: xxx
    则使用 chmod u+x *.sh 解决

    项目中添加依赖:

    implementation 'com.example.ai_teacher_flutter_module:flutter_release:3.0'
    

    同步即可,问题解决。

    相关文章

      网友评论

          本文标题:Flutter项目如何一键上传aar至maven(Nexus)

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