JavaScript 常常會需要修改後,執行壓縮等動作,常見的會是用 grunt 做類似下述命令:
- grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);
- grunt.registerTask('dist', ['concat:dist', 'uglify:dist']);
- 取自:Creating tasks - Grunt: The JavaScript Task Runner
不過要做檔案合併、檢查、壓縮.. 等等,應該不用這麼費工,Shell 就可以做到,於是簡單的寫了一套。
註:整個程式只有兩個檔案,全部內容只有5行,相信修改應該沒有難度。(程式語言:Linux 的 Bash Shell)
Linux Bash 監控檔案修改 執行即時合併
JavaScript 檢查程式、壓縮程式這些有各自喜好,請自行修改 Script 去達成即可。
此程式內含的只有做最簡單的檔案合併,可以自行靠 pipe 加上 jshine、uglify.. 等等。
- 完整程式於此處:tsung/watch-bash
- 此程式的功用在於開啟即時監控此目錄下的所有檔案,有任何修改,立刻做檔案合併的動作。
程式使用說明
- 執行:./watch_linux.sh
- 停止:Ctrl + c
程式修改說明
- 說明此程式用到的指令:
- watch:每秒執行一次,循序不斷地執行
- find:找出每秒更新的檔案
- cat:合併內容
- 想要對檔案、目錄做任何監控、排除等動作(watch_linux.sh),都使用 find 的命令達成 (iname、! -path .. 等等)。
- 想要對檔案做合併、壓縮等動作,修改 concat.sh,加入即可。
測試環境與操作
- cd /tmp
- git clone https://github.com/tsung/watch-bash
- cd watch-bash/example/ # 將 util.js 裡面的 Library 檔案合併在前面,將合併後的內容放於 dist/
- vim util.js # 隨意寫寫
- vim test.js # 隨意寫寫
- ./watch_linux.sh # 開啟 watch.sh
- vim test.js # 修改內容,註:修改 util.js 請不要開啟 watch.sh,或者 watch_linux.sh 需要增加排除 util.js 的檔案檢查(find)
- 於 dist/ 自動產生 test.min.js 的檔案,是將 util.js + test.js 合併起來的
用 inotifywait 可能比較有效率? kernel 直接跟你說哪個檔案有變動也省去那 1 秒的延遲. 不過, 如果真的是中大型的專案可能用 gulp/grunt 還是比較方便啦.
inotifywait 要另外安裝就沒有測試,看起來應該可以直接取代 find 這件事情。
另外想請問的是,gulp 和 grunt 方便在哪邊呢?
在有多組資源需要編譯的時候.. html/css/js 甚至單項資源可能有多個路徑用不同的設定, 或是要經過多次 compile 的時候, 用 bash 寫就顯的
*顯的煩亂.. 當然是一定寫的出來啦, 只是維護上我個人認為用 grunt/gulp 比較方便.
只有一兩個目錄或只有簡單的動作像 coffee->js, jslint 之類的動作要執行的時候那 bash 就會比較適合.
喔喔,我是覺得 shell script 靠 | 還蠻清楚的。
當然用 grunt / gulp 有他的方便性,只是目前我還沒找到適合的地方就是了