Flutter项目如何一键上传aar至maven(Nexus)
首先,建议参考此文章
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'
同步即可,问题解决。