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