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

2023-11-16  本文已影响0人  晖仔Milo

首先,建议参考此文章
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'

同步即可,问题解决。

上一篇下一篇

猜你喜欢

热点阅读