本文主要介绍一下 glob 库的使用。

glob 库的 pub 仓库地址:glob

1. glob 库的介绍

glob 库提供了文件和目录的通配符规则,它可以帮助我们检查某个 path 路径是否满足我们给定的通配符规则,同时支持列出所有满足通配符条件的文件和目录。

2. 依赖 glob 库

2.1 添加依赖

  1. dependencies:
  2. glob: ^2.0.2

glob 的版本号参考:Stable versions of glob

2.2 导包

  1. import 'package:glob/glob.dart';

3. glob 库的使用

3.1 构造一个 glob

想要创建一个 glob 对象,只需要使用 Glob() 即可。

  1. import 'package:glob/glob.dart';
  2. /// 最好定义为全局变量,方便复用
  3. final dartFile = Glob("**.dart");

3.2 检查是否匹配

检查一个 path 是否满足 Glob 的条件,使用 Glob.matches()

  1. import 'package:glob/glob.dart';
  2. final dartFile = Glob("**.dart");
  3. void main(List<String> arguments) {
  4. for (var argument in arguments) {
  5. if (dartFile.matches(argument)) print(argument);
  6. }
  7. }

3.3 列出所有满足条件的文件

可以使用 Glob.list()Glob.listSync() 列出与 glob 匹配的所有文件。

  1. import 'package:glob/glob.dart';
  2. import 'package:glob/list_local_fs.dart';
  3. final dartFile = Glob("**.dart");
  4. // Recursively list all Dart files in the current directory.
  5. void main(List<String> arguments) {
  6. for (var entity in dartFile.listSync()) {
  7. print(entity.path);
  8. }
  9. }

4. glob 库的通配符规则

4.1 匹配当前目录下,文件名中的任意字符:*

例子: lib/*.dart 会匹配 lib/glob.dart 但不会匹配 lib/src/utils.dart

4.2 跨目录匹配文件名中的任意字符:**

例子:lib/**.dart 会匹配 lib/glob.dartlib/src/utils.dart

如果 ** 出现在 glob 的开头,它将不匹配 绝对路径 或以 ../ 开头 的路径。

例如,**.dart 不会匹配 /foo.dart,但 /**.dart 会匹配。

4.3 匹配任何单个字符:?

?字符匹配除 / 之外的 单个字符。 与 * 不同,它不会匹配多于或少于一个字符。

例如, test?.dart 将匹配 test1.dart 但不匹配 test10.darttest.dart

4.4 匹配给定范围内的字符:[…]

匹配几个字符中的一个。它可以包含单个字符,例如 [abc],在这种情况下,它将匹配任何这些字符;

它可以包含范围,例如 [a-zA-Z],在这种情况下,它将匹配范围内的任何字符;或者它可以包含两者的混合。

例如,test[a-zA-Z_].dart 将匹配 testx.darttestA.dart 和 test_.dart,但不匹配 test-.dart

如果它以 ^! 开头,则匹配所有 未提及 的字符。例如,test[^a-z].dart 将匹配 test1.dart 但不匹配 testa.dart

4.5 匹配几种可能性之一:{…,…}

{...,...} 结构匹配几个选项之一,每个选项本身都是一个 glob。

例如,lib/{*.dart,src/*} 匹配 lib/glob.dartlib/src/data.txt。 它可以包含任何数量大于一的选项,甚至可以包含嵌套选项。

4.6 转义字符:\

\ 字符可以在任何上下文中用于转义一个在语义上有意义的字符。 例如,*.dart 匹配 *.dart 但不匹配 test.dart