关于entr的问题,其他的网站上有很多示例,对该工具也有很好的解释。
entr
是一个命令行工具,可让您在每次更改一组指定文件中的任何一个时运行任意命令。您向它传递要在stdin上观看的文件列表,如下所示:
git ls-files | entr bash my-build-script.sh
要么
find . -name *.rs | entr cargo test
或您真正想要的任何东西。
我发现每次更改代码时都必须手动重新运行构建/测试非常烦人。
许多工具(例如hugo和flask)都有内置的系统,可以在更改文件时自动重建。
但是,通常我会自己编写一些自定义的构建流程(例如bash build.sh
),并entr
让我拥有神奇的构建经验,在此我可以立即获得有关更改是否仅用一行bash即可解决怪异错误的反馈。万岁!
重新启动服务器(entr -r
)
但是如果您正在运行服务器,并且每次都需要重新启动服务器怎么办?entr有您-如果您通过了-r
,那么
git ls-files | entr -r python my-server.py
entr -c
)另一个简洁的标志是-c
,它使您可以在重新运行命令之前清除屏幕,从而不会因以前的版本的输出而分散注意力。
git ls-files
通常,我要跟踪的文件集与我在git中拥有的文件列表大致相同,因此git ls-files
很自然地将其传送到entr
。
我现在有一个项目,有时有时候我刚刚创建的文件还不在git中。那么,如果要包括未跟踪的文件怎么办?这是我拼凑的一点咒语:
{ git ls-files; git ls-files . --exclude-standard --others; } | entr your-build-scriot
可能只有一个git命令可以做到这一点,但我不知道它是什么。
entr -d
这git ls-files
件事的另一个问题是有时我会添加一个新文件,当然它还不在git中。entr为此提供了一个很好的功能–如果通过-d
,则如果在entr跟踪的任何目录中添加新文件,它将退出。
我将其与一个while循环结合使用,它将重新启动 entr
以包括新文件,如下所示:
while truedo{ git ls-files; git ls-files . --exclude-standard --others; } | entr -d your-build-scriotdone
在Linux上,entr使用inotify
(用于跟踪文件系统事件(如文件更改)的系统)工作-如果跟踪它,则会看到inotify_add_watch
要求您观看的每个文件的系统调用,如下所示:
inotify_add_watch(3, "static/stylesheets/screen.css", IN_ATTRIB|IN_CLOSE_WRITE|IN_CREATE|IN_DELETE_SELF|IN_MOVE_SELF) = 1152
希望这可以帮助一些人了解entr
!