12 个版本
| 0.4.4 | 2023 年 11 月 30 日 |
|---|---|
| 0.4.3 | 2022 年 8 月 10 日 |
| 0.4.2 | 2021 年 4 月 23 日 |
| 0.4.1 | 2020 年 10 月 15 日 |
| 0.2.1 | 2018 年 7 月 30 日 |
#229 in 开发工具
98 个月下载量
50KB
1K SLoC
fastmod
fastmod 是 codemod 的快速部分替换工具。像 codemod 一样,它是一个辅助你进行大规模代码库重构的工具,并且支持大多数 codemod 选项。与 codemod 的主要哲学差异在于它专注于改进“我想使用交互模式确保我的正则表达式正确,然后我想将正则表达式应用到每个地方”的使用案例。对于这个使用案例,它提供了比 codemod 更好的性能。因此,fastmod 不支持 codemod 的 --start、--end 或 --count 选项,也不支持类似 codemod 的 Python API 的任何内容。
示例
假设你正在弃用对 <font> 标签的使用。从命令行,你可以通过运行以下命令来取得进展:
fastmod -m -d /home/jrosenstein/www --extensions php,html \
'<font *color="?(.*?)"?>(.*?)</font>' \
'<span style="color: ${1};">${2}</span>'
对于正则表达式的每个匹配项,你将看到一个着色的差异并询问你是否想要接受更改(将 <font> 标签替换为 <span> 标签)、拒绝更改或编辑你选择的 $EDITOR 中的相关行。
注意:尽管codemod使用Python正则表达式,但fastmod使用Rust的regex crate,它支持略有不同的正则表达式语法,并且不支持前瞻或后引用。特别是,使用${1}代替\1来获取第一个捕获组的文本,并使用$$在替换字符串中写入字面量$。有关详细信息,请参阅regex crate的文档。
这种语法的后果是,在替换文本周围使用单引号而不是双引号非常重要,因为bash shell本身关心双引号字符串中的$字符。如果您必须双引号输入文本,请务必正确转义$字符!
fastmod也比codemod提供了更好的可用性改进:它接受文件或目录作为正则表达式和替换后的额外位置参数。例如,上面的示例可以重写为
fastmod -m --extensions php,html \
'<font *color="?(.*?)"?>(.*?)</font>' \
'<span style="color: ${1};">${2}</span>' \
/home/jrosenstein/www
这使得在需要时可以使用fastmod处理来自其他地方的文件列表。请注意,然而,fastmod在内部进行自己的并行目录遍历,因此使用find ... | xargs fastmod ...可能比单独使用fastmod要慢得多。
要求
fastmod主要支持macOS和Linux。
fastmod也被报告称在Windows上运行良好。主要的可移植性问题是1)使用具有回退的$EDITOR和2)控制台UI,它源自codemod基于ncurses的文本着色和屏幕清除代码。只要它们不是太侵入性,就会考虑Windows特定的问题和PR。例如,如果某个东西在Windows上不工作,因为使用了Linux/Mac特定的API而不是等效的POSIX或Rust标准库调用,我们将很高兴修复它。另一方面,我们希望避免直接依赖winapi或为Windows-only增强而大量增加我们的依赖图的大小。
构建fastmod
fastmod是用(稳定的)Rust编写的,并使用Rust的cargo构建系统编译。要构建
$ git clone https://github.com/facebookincubator/fastmod.git
$ cd fastmod
$ cargo build --release
$ ./target/release/fastmod --help
...
安装fastmod
安装fastmod的最简单方法是简单地使用cargo install fastmod。如果您已经根据上面的说明从源代码构建了fastmod,您可以使用cargo install安装您的构建。
fastmod的工作原理
fastmod 使用 ignore crate 来并行地在给定的目录层次结构中遍历,同时尊重 .gitignore。它使用 grep crate 来匹配每个文件,将匹配的文件读入内存,逐个应用给定的正则表达式替换,并使用 diff crate 来将结果更改以补丁的形式呈现供人工审查。
完整文档
请参阅 fastmod --help。
许可证
fastmod 使用 Apache-2.0 许可证。
依赖项
约 10–23MB
约 310K SLoC