glob 库的使用
本文主要介绍一下 glob 库的使用。
glob 库的 pub 仓库地址:glob
1. glob 库的介绍
glob 库提供了文件和目录的通配符规则,它可以帮助我们检查某个 path 路径是否满足我们给定的通配符规则,同时支持列出所有满足通配符条件的文件和目录。
2. 依赖 glob 库
2.1 添加依赖
dependencies:
  glob: ^2.0.2
glob 的版本号参考:Stable versions of glob
2.2 导包
import 'package:glob/glob.dart';
3. glob 库的使用
3.1 构造一个 glob
想要创建一个 glob 对象,只需要使用 Glob() 即可。
import 'package:glob/glob.dart';
/// 最好定义为全局变量,方便复用
final dartFile = Glob("**.dart");
3.2 检查是否匹配
检查一个 path 是否满足 Glob 的条件,使用 Glob.matches()。
import 'package:glob/glob.dart';
final dartFile = Glob("**.dart");
void main(List<String> arguments) {
  for (var argument in arguments) {
    if (dartFile.matches(argument)) print(argument);
  }
}
3.3 列出所有满足条件的文件
可以使用 Glob.list() 或 Glob.listSync() 列出与 glob 匹配的所有文件。
import 'package:glob/glob.dart';
import 'package:glob/list_local_fs.dart';
final dartFile = Glob("**.dart");
// Recursively list all Dart files in the current directory.
void main(List<String> arguments) {
  for (var entity in dartFile.listSync()) {
    print(entity.path);
  }
}
4. glob 库的通配符规则
4.1 匹配当前目录下,文件名中的任意字符:*
例子: lib/*.dart 会匹配 lib/glob.dart 但不会匹配 lib/src/utils.dart。
4.2 跨目录匹配文件名中的任意字符:**
例子:lib/**.dart 会匹配 lib/glob.dart 和 lib/src/utils.dart。
如果 ** 出现在 glob 的开头,它将不匹配 绝对路径 或以 ../ 开头 的路径。
例如,**.dart 不会匹配 /foo.dart,但 /**.dart 会匹配。
4.3 匹配任何单个字符:?
这 ?字符匹配除 / 之外的 单个字符。 与 * 不同,它不会匹配多于或少于一个字符。
例如, test?.dart 将匹配 test1.dart 但不匹配 test10.dart 或 test.dart
4.4 匹配给定范围内的字符:[...]
匹配几个字符中的一个。它可以包含单个字符,例如 [abc],在这种情况下,它将匹配任何这些字符;
它可以包含范围,例如 [a-zA-Z],在这种情况下,它将匹配范围内的任何字符;或者它可以包含两者的混合。
例如,test[a-zA-Z_].dart 将匹配 testx.dart、testA.dart 和 test_.dart,但不匹配 test-.dart。
如果它以 ^ 或 ! 开头,则匹配所有 未提及 的字符。例如,test[^a-z].dart 将匹配 test1.dart 但不匹配 testa.dart。
4.5 匹配几种可能性之一:
{...,...} 结构匹配几个选项之一,每个选项本身都是一个 glob。
例如,lib/{*.dart,src/*} 匹配 lib/glob.dart 和 lib/src/data.txt。 它可以包含任何数量大于一的选项,甚至可以包含嵌套选项。
4.6 转义字符:\
\ 字符可以在任何上下文中用于转义一个在语义上有意义的字符。 例如,*.dart 匹配 *.dart 但不匹配 test.dart。
