Flutter - 一行命令解决多个pubspec.yaml文件的依赖项问题

news2024/11/24 16:40:05

文章目录

  • 前言
  • 开发环境
  • Flutter内置命令
  • 一行命令实现
    • 1. 命令使用
    • 2. 命令解释
    • 3. 命令扩展
  • 最后


前言

项目为了模块化,创建了一堆PackagePlugin,这么做没什么问题,但是遇到Flutter SDK目录路径变化或者其他一些情况导致需要重新获取依赖项时就麻烦了。麻烦之处在于需要在每个pubspec.yaml文件所在的目录中运行flutter pub get命令,虽然也不是什么大问题,但是这种重复简单的操作实在不想做。

开发环境

  • Flutter: 3.10.2
  • Dart: 3.0.2

Flutter内置命令

如果你研究过Flutter SDK(Flutter框架项目),那么你对flutter update-packages命令一定不陌生,执行这个命令可以获取Flutter框架项目所需要的全部依赖项,避免一个个去执行flutter pub get命令。可惜这个命令只能用于Flutter框架项目,不过我们可以先看看Flutter是怎么做的,然后自己实现一个。

根据flutter update-packages命令执行时的输出日志Ran pub get in ...,可以快速定位到update_packages.dart文件(位于Flutter框架项目/packages/flutter_tools/lib/src/commands目录)中的_runPubGetOnPackages方法:

screenshot1

Future<void> _runPubGetOnPackages(List<Directory> packages) async {
  ...
  try {
    ...
    for (final Directory dir in packages) {
      unawaited(queue.add(() async {
        final Stopwatch stopwatch = Stopwatch();
        stopwatch.start();
        await pub.get(
          context: PubContext.updatePackages,
          project: FlutterProject.fromDirectory(dir),
          // All dependencies should already have been downloaded by the fake
          // package, so the concurrent checks can all happen offline.
          offline: true,
          outputMode: PubOutputMode.none,
        );
        stopwatch.stop();
        final double seconds = stopwatch.elapsedMilliseconds / 1000.0;
        final String relativeDir = globals.fs.path.relative(dir.path, from: Cache.flutterRoot);
        globals.printStatus('Ran pub get in $relativeDir in ${seconds.toStringAsFixed(1)}s...');
      }));
      count += 1;
    }
    ...
  } catch (exception) { // ignore: avoid_catches_without_on_clauses
    status.cancel();
    rethrow;
  }
  ...
}

pub.get方法的作用就是执行pub get命令。通过这个方法大概也清楚了,其实Flutter是通过遍历全部项目路径,然后一个个执行pub get命令的方式获取的依赖项。那项目路径列表是怎么获得的呢?

根据_runPubGetOnPackages方法的调用,找到packages初始化的位置:


Future<FlutterCommandResult> runCommand() async {
  final List<Directory> packages = runner!.getRepoPackages();
  ...
  await _runPubGetOnPackages(packages);

  return FlutterCommandResult.success();
}

继续找下去会发现,Flutter其实也是通过递归找到项目路径(包含pubspec.yaml文件的目录路径):

static List<String> _gatherProjectPaths(String rootPath) {
  if (globals.fs.isFileSync(globals.fs.path.join(rootPath, '.dartignore'))) {
    return <String>[];
  }
  
  final List<String> projectPaths = globals.fs.directory(rootPath)
    .listSync(followLinks: false)
    .expand((FileSystemEntity entity) {
      if (entity is Directory && !globals.fs.path.split(entity.path).contains('.dart_tool')) {
        return _gatherProjectPaths(entity.path);
      }
      return <String>[];
    })
    .toList();

  if (globals.fs.isFileSync(globals.fs.path.join(rootPath, 'pubspec.yaml'))) {
    projectPaths.add(rootPath);
  }

  return projectPaths;
}

这么一分析,好像Flutter用的方法也蛮简单的,大家一般也都能想的到。

一行命令实现

1. 命令使用

按照这个思路,我首先想到可以写一个shell脚本,递归遍历出全部的项目路径,然后再挨个执行flutter pub get命令,结果写着写着发现完全用不到shell脚本,一行命令就可以解决了。

完整命令如下:

find [path] -name "pubspec.yaml" -exec dirname {} \; | xargs -I {} flutter pub get -C {}

注意,使用时请将命令中的[path]替换为你的Flutter项目路径。如果命令就在Flutter项目路径下执行,那么可以直接使用以下命令(.表示当前路径):

find . -name "pubspec.yaml" -exec dirname {} \; | xargs -I {} flutter pub get -C {}

2. 命令解释

命令主要分前后两部分,用管道符|分割,前半部分用于查找所有的项目路径,后半部分用于获取全部的依赖项。

  • find [path] -name "pubspec.yaml":在指定的路径中递归查找所有名称为pubspec.yaml的文件
  • -exec dirname {} \;:对于找到的每个文件,执行dirname命令获取目录路径
  • |:管道符,将前一个命令的输出传递给下一个命令
  • xargs -I {} flutter pub get -C {}xargs 命令的作用是将管道传递的输入转换为命令行参数,-I 选项用于指定替换字符串 {}。简单来说,每一个项目路径都会转化为flutter pub get -C 项目路径命令执行

可以通过执行man findman xargs命令获取更多关于findxargs命令的使用方法。

3. 命令扩展

前面的命令用于获取全部依赖项,稍微修改后同样也可以用于升级全部依赖项:

find [path] -name "pubspec.yaml" -exec dirname {} \; | xargs -I {} flutter pub upgrade -C {}

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞👍加星🌟,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/613726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

50+常用的广告联盟术语 (常用缩写)

广告联盟术语是指与广告联盟业务有关的行话和缩写。这些术语通常用于描述商业模型、营销策略、流量源、收益模型等方面的概念。了解广告联盟术语对于广告主、联盟会员、广告服务提供商等参与者都非常重要&#xff0c;因为它们可以帮助他们更好地理解广告联盟业务&#xff0c;提…

IDEA 2022.3.3 创建SpringBoot项目

目录 步骤01&#xff1a;快速创建项目 步骤02&#xff1a;选择依赖 步骤03&#xff1a;pom文件中版本问题 ​步骤04&#xff1a;启动测试 4.1、认识引导类 4.2、创建Controller类进行测试 可能遇到的问题及解决方案 附件1&#xff1a;pom文件源码 附件2&#xff1a;项…

华为OD机试题【食堂供餐】【2023 B卷 100分】

文章目录 &#x1f3af; 前言&#x1f3af; 题目描述&#x1f3af; 解题思路&#x1f4d9; Python代码实现&#x1f4d7; Java代码实现&#x1f4d8; C语言代码实现 &#x1f3af; 前言 &#x1f3c6; 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为OD机试真题最…

Python使用正则表达式识别代码中的中文、英文和数字实例演示

Python 正则表达式识别代码中的中文、英文和数字 识别中文识别英文识别数字拓展 在文本处理和数据分析中&#xff0c;有时候需要从代码中提取出其中包含的中文、英文和数字信息。正则表达式是一种强大的工具&#xff0c;可以帮助我们实现这一目标。本文将分三个部分详细介绍如何…

chatgpt赋能python:Python如何倒序输出一组数

Python如何倒序输出一组数 Python是一种广泛使用的高级编程语言&#xff0c;由于其易读性和简洁性&#xff0c;Python已成为Web开发、数据分析以及人工智能等方向的首选语言。而在程序编写过程中&#xff0c;倒序输出一组数也是一个经常用到的操作。在本文中&#xff0c;我们将…

ActiveReportsJS 4.0.2 Crack ActiveReportsJS New

ActiveReportsJS - 高级 JavaScript 报告解决方案 ActiveReportsJS 是一个强大的 Web 应用程序报告工具&#xff0c;它允许开发人员和报告作者轻松地在他们的应用程序中设计和显示报告。凭借广泛的功能&#xff0c;例如向下钻取、运行时数据过滤和参数驱动的报告&#xff0c;以…

基于时间的访问控制列表(ACL)配置实验

基于时间的访问控制列表&#xff08;ACL&#xff09;配置实验 【实验目的】 掌握基于时间的ACL配置。认识给予时间的ACL的作用。验证配置。 【实验拓扑】 实验拓扑如下图所示。 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 R1 S0/3/0 192.168.1.1 255…

24万字智慧城市时空信息云平台 大数据一体化 解决方案word

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除篇幅有限&#xff0c;无法完全展示&#xff0c;喜欢资料可转发评论&#xff0c;私信了解更多信息。 第二章 XX新型智慧城市总体设计 2.1 新型智慧城市核心技术 2.2 新型智慧城…

chatgpt赋能python:Python如何倒着循环:一步步教你倒序遍历序列

Python如何倒着循环&#xff1a;一步步教你倒序遍历序列 Python是一种高级编程语言&#xff0c;因其语法简单易学&#xff0c;常被用于数据分析、机器学习、自然语言处理等领域。在实际开发中&#xff0c;我们经常需要遍历序列。有时需要倒着循环序列&#xff0c;本文将详细介…

Roop:Colab脚本使用方法!

​AI领域人才辈出&#xff0c;突然就跳出一个大佬“s0md3v”&#xff0c;开源了一个单图就可以进行视频换脸的项目。 项目主页给了一张换脸动图非常有说服力&#xff0c;真是一图胜万言。 快速在本地配置一个环境&#xff0c;验证了一下&#xff0c;确实还不错。主要是&#xf…

使用ChatGPT生成思维导图(附永久免费镜像网址)

前言 思维导图&#xff08;The Mind Map&#xff09;&#xff0c;是表达发散性思维的有效图形思维工具。思维导图运用图文并重的技巧&#xff0c;把各级主题的关系用相互隶属与相关的层级图表现出来&#xff0c;把主题关键词与图像、颜色等建立记忆链接 &#xff0c;可以应用于…

Python-web开发学习笔记(3):CSS基础

&#x1f680; Python-web开发学习笔记系列往期文章&#xff1a; &#x1f343; Python-web开发学习笔记&#xff08;1&#xff09;--- HTML基础 &#x1f343; Python-web开发学习笔记&#xff08;2&#xff09;--- HTML基础 &#x1f343; Python-web开发学习笔记&#xff08…

网络层概述及提供的两种服务

1.网络层概述及提供的两种服务 笔记来源&#xff1a; 湖科大教书匠&#xff1a;网络层概述 湖科大教书匠&#xff1a;网络层提供的两种服务 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 网络层概述 网络层的主要任务是实现网络互连&#xf…

Linux 高级篇-日志管理

Linux 高级篇-日志管理 基本介绍 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。日志对于安全来说也很重要&#xff0c;它记录了系统每天发生的…

Python读写EXCEL文件常用方法

python读写excel的方式有很多&#xff0c;不同的模块在读写的讲法上稍有区别&#xff0c;这里我主要介绍几个常用的方式。 用xlrd和xlwt进行excel读写&#xff1b;用openpyxl进行excel读写&#xff1b;用pandas进行excel读写&#xff1b; 一、数据准备 为了方便演示&#xf…

在滴滴和字节干了4年测试开发,简直不要太真实…

先简单交代一下&#xff0c;某不知名211的本硕&#xff0c;18年毕业加入滴滴&#xff0c;之后跳槽到了头条&#xff0c;一直从事测试开发相关的工作。之前没有实习经历&#xff0c;算是四年的工作经验吧。 这四年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;有过开…

Linux环境下Mysql8的下载、安装、主从模式搭建

主库部署 下载 下载地址:MySQL :: Download MySQL Community Server (Archived Versions) 文件名称:mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz 解压 先解压xz xz -d mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz 再解压tar tar -xvf mysql-8.0.17-linux-glibc2.12-…

QT 5.14 和 VS2017脱机离线安装记录

QT 5.14是最后的离线安装版本&#xff0c;都推荐这个。看了下&#xff0c;官方建议搭配 VS2017/VS2015 VS版本对于QT&#xff0c;我一直偏好社区版&#xff0c;只要编译器就够了&#xff0c;自己加上SDK目录。因为大部分工作都是在QT内完成。VS2017的离线安装比较复杂&#xff…

区间预测 | MATLAB实现基于QRCNN-BiLSTM卷积神经网络结合双向长短期记忆神经网络多变量时间序列区间预测

区间预测 | MATLAB实现QRCNN-BiLSTM卷积神经网络结合双向长短期记忆神经网络多变量时间序列区间预测 目录 区间预测 | MATLAB实现QRCNN-BiLSTM卷积神经网络结合双向长短期记忆神经网络多变量时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 1.Mat…

Android 14 之返回界面升级:预览目标界面 + 全新返回箭头

Android 13 的版本里 Android 就针对返回导航进行了大量更改&#xff0c;包括&#xff1a; 废弃原有的 KEYCODE_BACK KeyEvent提供 Manifest 属性 enableOnBackInvokedCallback 以配置是否应用全新的 Back 导航特性提供 Activity、Dialog 里处理 Back 导航的 OnBackInvokedDis…