当前位置: 首页 > news >正文

Linux/CentOS 安装 flutter 与 jenkins 构建 (踩坑)

不论在Ubuntu 还是 CentOS,强烈推荐使用snapd 安装,因为不用额外安装 Linux toolchain!

由于我在Linux和Flutter还是小白,又在CentOS 7上有采用了手动安装Flutter,导致安装 Linux toolchain 时可把我坑惨了。官方的toolchain 在Ubuntu 上很方便,但在CentOS上 ninja,pkgconfig,libgtk-3-dev 没有直接的源,导致安装起来非常麻烦:

apt-get install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev

使用 snapd 安装则不需要这个步骤。

 

 一、安装snap

Installing snap on CentOS | Snapcraft documentation

sudo yum install epel-release

sudo yum install snapd

sudo systemctl enable --now snapd.socket

sudo ln -s /var/lib/snapd/snap /snap

二、snap 安装 flutter:

snap install flutter --classic

source /etc/profile,或重启系统后,flutter可被识别到。而后执行 

flutter doctor

注意,jenkins因为各种环境问题,可能会找不到 flutter,因此在脚本执行flutter前,PATH添加 snap路径:

export PATH=$PATH:/var/lib/snapd/snap/bin

三、升级 git

  • CentOS 7默认git版本是1.8.3
  • 此版本git存在BUG会导致Flutter识别的版本变为0.0.0-unknown
yum -y install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm

yum -y update git

或者使用snap 安装(还未尝试过) 

sudo snap install git-ubuntu --classic

四、flutter的 git依赖组件(可选)

flutter pub 可以使用 git,但对于需要密码的git,如果使用http或https方式,用户名和秘密会有暴露的风险,建议使用SSH。如果是http或https,在jenkins flutter build 之前,将 pubspec.yaml 内的链接替换为git@xxx: :

sed -i 's|https://xxxxxxx/|git@xxxxxxxx:|g' pubspec.yaml

 在打包机上生成ssh key:

cd ~/.ssh
# 没有 .ssh 则新建一个

# xxxx 随意,key的名称
ssh-keygen -t rsa -C "xxxx"

注意:回车后,不要填任何东西,直接回车,不然flutter 的 git找不到 ssh 密钥
Enter file in which to save the key (/xxx) (回车)
Enter passphrase (回车)
Enter same passphrase again: (回车)

而后 把 id_rsa.pub 内容贴到 git 仓库的 ssh 授权中(不同仓库操作不一样,请自行搜索)

最后验证 git 联通性:

ssh -T git@xxxx

当有提示 welcome 等信息时,就说明链接成功,有错误自行搜索下
 

六、repositories 覆盖

由于在app 的build.gradle中,flutter 要求添加以下脚本,导致我们自定义替换的repositories 无法替换掉它里面的 google 源:

apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

  flutter SDK 的 flutter.gradle中有以下强制配置:

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        /* When bumping, also update ndkVersion above. */
        classpath 'com.android.tools.build:gradle:4.1.0'
    }
}

导致如果google连不上,会出现很奇怪的  com.android.tools.build:gradle:4.1.0 找不到,google 仓库无法连接的编译bug。

此时,只能对flutter.gradle 进行强制修改:

buildscript {
    repositories {
        maven {
            try {allowInsecureProtocol = true} catch (Throwable e) {}
            url "xxxxxxx" // 使用我们自己的 maven 或者国内源,例如 aliyun 的
        }

        // google()
        // mavenCentral()
    }
    dependencies {
        /* When bumping, also update ndkVersion above. */
        classpath 'com.android.tools.build:gradle:4.1.0'
    }
}

此外,还有第三方插件也有类似的问题,也会出现各中 com.android.tools.build:gradle 找不到。此时需要在 rootProject 的build.gradle 添加以下脚本,以在依赖的子工程脚本执行前添加 我们的repositories覆盖顺序:

subprojects {
    repositories {
        maven {
            url = "xxxx" // 要替换的 url
        }
    }

    buildscript.repositories {
        maven {
            url = "xxxx" // 要替换的 url
        }
    }
}

七、替换 pub 源:

环境变量添加  PUB_HOSTED_URL 和 FLUTTER_STORAGE_BASE_URL,jenkins脚本增加:

export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

 八、执行gradle task:

# 先在工程目录下执行 packages get
flutter packages get

#同步完成后,cd到 Android目录执行 gradlew
cd android
chmod 777 gradlew

./gradlew xxxxTask

cd ..

flutter build xxxxxx

总结:

1、使用snap 安装flutter,升级git

2、repositories 覆盖

3、Jenkins脚本要修改环境变量,大致为:

export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH=$PATH:/var/lib/snapd/snap/bin

# git 替换 ssh访问
sed -i 's|https://xxx/|git@xxx:|g' pubspec.yaml

flutter packages get

cd android
chmod 777 gradlew

./gradlew xxxTask

cd ..

flutter build appbundle --obfuscate --split-debug-info=./debug_info

参考:

如何在 Linux 上安装和设置 Flutter 开发环境-51CTO.COM

linux部署flutter环境__Leo的博客-CSDN博客_centos flutter

相关文章:

  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • 随想录一期 day4 [24. 两两交换链表中的节点|19. 删除链表的倒数第 N 个结点|面试题 02.07. 链表相交|142. 环形链表 II]
  • iOS动画相关
  • LeetCode往完全二叉树添加节点
  • Linux、docker、kubernetes、MySql、Shell运维快餐
  • 基数(桶)排序算法详解之C语言版
  • 生成模型的中Attention Mask说明
  • java毕业设计企业固定资产管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  • Java---Java Web---JSP
  • opencv 机器学习-人脸识别
  • JavaScript的函数
  • java基于springboot+vue基本微信小程序的乒乓球课程管理系统 uniapp小程序
  • 安装数据库中间件——Mycat
  • 爬虫之Scrapy框架
  • 哈工大李治军老师操作系统笔记【23】:内存换出(Learning OS Concepts By Coding Them !)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 4. 路由到控制器 - Laravel从零开始教程
  • 78. Subsets
  • Android 控件背景颜色处理
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Redash本地开发环境搭建
  • Redis的resp协议
  • SpriteKit 技巧之添加背景图片
  • Terraform入门 - 1. 安装Terraform
  • underscore源码剖析之整体架构
  • Vim 折腾记
  • Vue 重置组件到初始状态
  • win10下安装mysql5.7
  • 产品三维模型在线预览
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 使用API自动生成工具优化前端工作流
  • 跳前端坑前,先看看这个!!
  • 优秀架构师必须掌握的架构思维
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​虚拟化系列介绍(十)
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #pragma data_seg 共享数据区(转)
  • #WEB前端(HTML属性)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (八十八)VFL语言初步 - 实现布局
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)插入排序
  • (译) 函数式 JS #1:简介
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)memcache、redis缓存
  • (转)清华学霸演讲稿:永远不要说你已经尽力了