entr:文件更改時重新運行構建
這是一篇簡短的文章。我是最近才發現 entr 的,我很驚奇從來沒有人告訴過我?!因此,如果你和我一樣,那麼我告訴你它是什麼。
entr 的網站上對它已經有很好的解釋,也有很多示例。
總結在其頭部:entr
是一個命令行工具,當每次更改一組指定文件中的任何一個時,都能運行一個任意命令。你在標準輸入給它傳遞要監控的文件列表,如下所示:
git ls-files | entr bash my-build-script.sh
或者
find . -name *.rs | entr cargo test
或者任何你希望的。
快速反饋很棒
就像世界上的每個程序員一樣,我發現每次更改代碼時都必須手動重新運行構建/測試非常煩人。
許多工具(例如 hugo 和 flask)都有一個內置的系統,可以在更改文件時自動重建,這很棒!
但是通常我會自己編寫一些自定義的構建過程(例如 bash build.sh
),而 entr
讓我有了一種神奇的構建經驗,我只用一行 bash 就能得到即時反饋,知道我的改變是否修復了那個奇怪的 bug。萬歲!
重啟伺服器(entr -r)
但是如果你正在運行伺服器,並且每次都需要重新啟動伺服器怎麼辦?如果你傳遞 -r
,那麼 entr
會幫你的
git ls-files | entr -r python my-server.py
清除屏幕(entr -c)
另一個簡潔的標誌是 -c
,它讓你可以在重新運行命令之前清除屏幕,以免被前面構建的輸出分散注意力。
與 git ls-files 一起使用
通常,我要跟蹤的文件集和我在 git 中的文件列表大致相同,因此將 git ls-files
傳遞給 entr
是很自然的事情。
我現在有一個項目,有時候我剛創建的文件還沒有在 git 里。那麼如果你想包含未被跟蹤的文件怎麼辦呢?這些 git
命令行參數就可以做到(我是從一個讀者的郵件中得到的,謝謝你!):
git ls-files -cdmo --exclude-standard | entr your-build-script
有人給我發了郵件,說他們做了一個 git-entr
命令,可以執行:
git ls-files -cdmo --exclude-standard | entr -d "$@"
我覺得這真是一個很棒的主意。
每次添加新文件時重啟:entr -d
git ls-files
的另一個問題是有時候我添加一個新文件,當然它還沒有在 git 中。entr
為此提供了一個很好的功能。如果你傳遞 -d
,那麼如果你在 entr
跟蹤的任何目錄中添加新文件,它就會退出。
我將它與一個 while
循環配合使用,它將重啟 entr
來包括新文件,如下所示:
while true
do
{ git ls-files; git ls-files . --exclude-standard --others; } | entr -d your-build-scriot
done
entr 在 Linux 上的工作方式:inotify
在 Linux 中,entr
使用 inotify
(用於跟蹤文件更改這樣的文件系統事件的系統)工作。如果用 strace
跟蹤它,那麼你會看到每個監控文件的 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
!
via: https://jvns.ca/blog/2020/06/28/entr/
作者:Julia Evans 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive