- Published on
gulpチュートリアル フォルダを再帰的に監視し、LINEを送信するまで
- Authors
- Name
- Shou Arisaka nyapp.buzz/shou
- short bio
- Z世代の情報技術者。Next.jsで自作SNSを個人開発中。
gulpの、インストールと基本的な使い方から、フォルダを再帰的に監視し、変化があればLINEを送信するまでやってみました。
contacamで動作感知し、動画を撮影し、自動でリモートサーバーにバックアップ。ここまでは一つのプロセスとしていいのですが、これにもう一つ、"すぐに知れたら良いな"、と思いまして、そのために以前一回だけ使ったことがあるっきりのgulpでやってみよう、と思い使ってみました。
とりあえずgulpを動かしたい人へ
以下のシェルスクリプトを参考にどうぞ。
mkdir gulp_dev; cd gulp_dev
npm install -g gulp # 初回だけ。
npm install -D gulp # or npm install --save-dev gulp # プラグインを使う時も npm install --save-dev gulp-uglify のようにする。
npm init -y # create package.json
cat << EOT > gulpfile.js
var gulp = require("gulp");
gulp.task("change", function() {
console.log("変更されたよ")
});
gulp.task("watch", function() {
var targets = [
'./*'
];
gulp.watch(targets, ['change']);
});
EOT
gulp watch
# gulp_devフォルダの中のファイルを変更して保存してみる
# =>
# => [14:32:36] Finished 'change' after 317 μs
# => [14:32:38] Starting 'change'...
# => 変更されたよ
# => [14:32:38] Finished 'change' after 88 μs
# => [14:33:17] Starting 'change'...
# => 変更されたよ
スクリプトの説明
この前に、nodejsをインストールしていなければインストールします。:sudo apt install -y nodejs
mkdir gulp_dev; cd gulp_dev
ファイルを監視したいプロジェクトフォルダを指定します。 今回は新規に作りました。
npm install -g gulp # 初回だけ。
システムにgulpをインストールします。
npm install -D gulp # or npm install --save-dev gulp # プラグインを使う時も npm install --save-dev gulp-uglify のようにする。
ローカルにgulpをインストールします。
npm init -y # create package.json
package.jsonという、gulpを動かすのに必要な設定ファイルを作成します。
cat << EOT > gulpfile.js
#scripts
EOT
gulpfileという、gulpのメインスクリプトを書くファイルを作成します。これを編集して、gulpとかプラグインとかを動かします。
エラー
root@DESKTOP-UHU8FSH:/mnt/c/pg/gulp# gulp
[14:04:31] Warning: gulp version mismatch:
[14:04:31] Global gulp is 3.9.1
[14:04:31] Local gulp is 1.0.0
module.js:538
throw err;
^
Error: Cannot find module 'gulp'
at Function.Module._resolveFilename (module.js:536:15)
at Function.Module._load (module.js:466:25)
at Module.require (module.js:579:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/mnt/c/pg/gulp/gulpfile.js:1:74)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
このエラーは、npm install -D gulpをしていない場合に起こります。
今回30分位ハマったのがこのエラー。
root@DESKTOP-UHU8FSH:/mnt/c/pg/gulp# npm install -D gulp
npm ERR! code ENOSELF
npm ERR! Refusing to install package with name "gulp" under a package
npm ERR! also called "gulp". Did you name your project the same
npm ERR! as the dependency you're installing?
npm ERR!
npm ERR! For more information, see:
npm ERR! <https://docs.npmjs.com/cli/install#limitations-of-npms-install-algorithm>
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2018-02-10T05_09_54_461Z-debug.log
このエラーは、フォルダ名が"gulp"だと起こるようです。
調べてもわからなかったけどsameとか書いてあるし、勘で作業フォルダ名をgulp_dev
とかにしてやってみたら解決したって感じです。
gulpでコマンドを実行する
gulp内でbashコマンドを実行することも可能です。 child_processプラグインを使用します。
npm install child_process
以下はgulp watch
で再帰的にフォルダを監視し、変化があれば上記同様標準出力をするとともに、pwd
コマンドを実行する例です。 gulp child_process_sample
で動作が確認できます。
var gulp = require("gulp");
var ps = require('child_process').exec;
gulp.task("change", function() {
console.log("変更されたよ")
});
gulp.task('child_process_sample', function() {
var command = "pwd"; //ここでメールを送信するスクリプトor音楽を鳴らすスクリプトを実行 for contacam
ps(command , function (err, stdout, stderr) {
console.log(stdout);
});
});
gulp.task("watch", function() {
var targets = [
'./*/*/*/*/*/*',
'./*/*/*/*/*',
'./*/*/*/*',
'./*/*/*',
'./*/*',
'./*'
];
gulp.watch(targets, ['change','child_process_sample']);
});
フォルダを再帰的に監視し、変化があればLINEを送信するgulpスクリプト
Line notifyのAPIを使って、LINEを送信するようにします。 YOURLINEAPIKEYを書き換えて使用してください。
結構無理矢理な再帰(物理)ですが、再帰的にっていうのは調べてもできこなかったので無理なんじゃないかと。一応こういうやり方でも相当ネストこじらせてない限り使えるので、これでやってますが。 できるようならコメントで教えていただけるとうれしいです。
var gulp = require("gulp");
var ps = require('child_process').exec;
gulp.task("change", function() {
console.log("変更されたよ")
});
gulp.task('child_process_sample', function() {
var command = "pwd"; //
ps(command , function (err, stdout, stderr) {
console.log(stdout);
});
});
gulp.task('send_line', function() {
var command = "curl https://notify-api.line.me/api/notify -X POST -H 'Authorization: Bearer <YOURLINEAPIKEY>' -F 'message=ファイルの変更がありました。 by gulp'"; /
ps(command , function (err, stdout, stderr) {
console.log(stdout);
});
});
gulp.task('send_mail', function() {
var command = ""; //ここでメールを送信するスクリプトor音楽を鳴らすスクリプトを実行 for contacam
ps(command , function (err, stdout, stderr) {
console.log(stdout);
});
});
gulp.task("watch", function() {
var targets = [
'./*/*/*/*/*/*',
'./*/*/*/*/*',
'./*/*/*/*',
'./*/*/*',
'./*/*',
'./*'
];
gulp.watch(targets, ['change','send_line']);
});
追記:再帰的できました。
こんな感じで、**
でやるといいらしいです。
var targets = [
// './*/*/*/*/*/*',
// './*/*/*/*/*',
// './*/*/*/*',
// './*/*/*',
// './*/*',
'./**'
];
sass変換とかする際に、/sass
だったりsrc
だったり、assets
だったりでフォルダ名が違ったり、はたまた/src/sass
とか2つフォルダ挟んでたりしてても、/**/*.sass
で全てのフォルダの.sassを対象とできるので、この書き方は便利ですね。
フォルダを再帰的に監視し、変化があればメールを送信するgulpスクリプト
は、できませんでした。
mailコマンドとかpythonでメール送信とかも試してみたけどエラーしかでない…。
コマンドそのまま埋めればいいだけなので、できる人はそれでやってみたらできると思います。解決したら記事にします。
本当はメールで色々受信したほうが応用も効いて汎用性高いんですが、仕方ないのでLINE notifyを使ってます。同じように悩んでる人はLINE notifyおすすめです。
参考
15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。