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

这篇具有很好参考价值的文章主要介绍了Flutter - 一行命令解决多个pubspec.yaml文件的依赖项问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

项目为了模块化,创建了一堆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方法:

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

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用的方法也蛮简单的,大家一般也都能想的到。如果需要调试以上源码,可以参考文章Flutter - 命令行工具源码调试环境搭建。

功能实现

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

1. 一行命令

完整命令如下:

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 {}

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞👍加星🌟,谢谢~文章来源地址https://www.toymoban.com/news/detail-476772.html

到了这里,关于Flutter - 一行命令解决多个pubspec.yaml文件的依赖项问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一行python命令让手机读取电脑文件_python手机端查看文件

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Python全套学习资料》,初

    2024年04月25日
    浏览(38)
  • appium+夜神模拟器操作微信小程序,多个模拟器要结合yaml配置文件来并发控制,一万多行代码[建议收藏]

    技术心得 python+appium+夜神模拟器+结合yaml配置文件实现并发采集任务。   代码如下 : 模拟器的配置文件如下: 欢迎大家一起学习,一起进步,喜欢私聊。

    2024年02月13日
    浏览(50)
  • 使用pyinstaller将具有多个python文件的项目打包为exe(含依赖库)

    1、将需要打包有python文件放到一个文件夹,例如下图所示的Demo文件夹,其中ClickEveryDay.py为主文件,telegram.ico为图标文件。   2、生成主函数对应的spec文件 命令:在Demo文件夹路径下使用:pyi-makespec ClickEveryDay.py,将产生一个ClickEveryDay.spec文件。 3、修改ClickEveryDay.spec文件:加

    2024年02月11日
    浏览(57)
  • eclipse maven 项目 如果有多个依赖项 时, 有的包 无法 publish 到 lib 的解决方法

    我的web项目引用了一些自己开发的maven 子工程 所以经常遇到一种问题 就是maven工程依赖多个子工程时 在发布到tomcat 临时目录时,有的包 无法 publish 到 lib 经过尝试 终于知道问题 1 我们的maven 子工程 可能没有报异常,但是 实际上 是有问题的 这个时候你可以选择 run as- maven ve

    2024年02月12日
    浏览(47)
  • 解决npm命令安装依赖时报错

    今天在拉完项目,执行 npm install 命令的时候,一直报错,解决了好久,终于解决啦。报错信息如下: ​ npm ERR! C:Program FilesGitcmdgit.EXE ls-remote -h -t git://github.com/adobe-webplatform/eve.git 截图如下: npm ERR! Error while executing: npm ERR! C:Program FilesGitcmdgit.EXE ls-remote -h -t git://github.co

    2023年04月10日
    浏览(35)
  • cp命令 复制多个目录/文件夹下文件到指定目录

    可以使用cp命令的通配符和递归选项来复制多个目录下多个文件夹下的文件到指定目录。 如果目标目录不存在,可以使用 mkdir -p命令来创建目录。 -p 选项表示递归创建目录,如果目录已经存在,则不会报错。 例如,以下命令会复制 /path/to/dir1和 /path/to/dir2 下的所有子目录中的

    2024年02月12日
    浏览(73)
  • 【python】一行输入多个整数并排序输出

    【例1】一行输入若干整数,用空格分隔,从小大大排序输出。 范例: 如何一行输入多个值? 我们使用 input().split() 的方法,进行输入和分隔。 input() 即输入函数,输入的数据类型都是字符串类型。 split() 既可以将多个字符互传进行分割切片。 需要注意的是,通过 split() 分割

    2024年02月05日
    浏览(42)
  • 在Idea编辑中,解决Spring Boot之.yaml或.properties配置文件不能自动提示的问题,或者配置Spring Boot的.yaml或.properties文件的自动提示

    我们使用 idea 编辑器创建 spring boot 项目,并添加了 .yaml 或 .properties 配置文件后,在配置相关信息时,一般是需要它自动提示,如下图所示: 然而,我在配置 druid 却没有显示,如下如所示: 那么,这是怎么回事呢? 参考网上的教程,使用如下4个步骤分析。 使用 CTRL + ALT

    2024年02月16日
    浏览(51)
  • netrw模拟nerdtree的go命令连续打开多个文件

    vim9自带的文件浏览器 netrw 功能很强大。过去用惯了 nerdtree 的我,对 netrw 的文件操作还要适应一些时间。 使用 netrw 一段时间后发现它没有 nerdtree 的go命令的替代操作,今天就自制一个。 nerdtree 的go命令功能:就是在右边窗口打开一个文件后,光标还留在左边的文件浏览器窗

    2024年02月09日
    浏览(106)
  • `sh -c`命令——解决命令权限问题、一条命令中执行多个指令

    sh -c 在Shell中执行一个字符串作为命令,可以在一条命令中执行多个指令。 其中, command 是要执行的命令或命令串。 **1、 sh -c 属于非交互模式 在终端上敲入命令就可以显示对应结果,这样与终端进行交互执行命令的方式就称为交互模式。 非交互模式就是调用 bash 解释器,通

    2024年03月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包