イラストレーターみやびの漫画館 作品集 - 月の高いところのロゴマーク

今日のプリン言

謎のプリン語る。
一人書く人増えました。

Gulp、watchの自動起動(Windows)

2017年04月24日

みやびプリン 140 87

500 320

Gulp、watchの自動起動(Windows) - サムネイル

どうも、
最近、Gulpをちょいちょいやっています。

以前の記事で、てきとうにRubyだとか言ってしまったが、
JavaScript(以下JS)でしたね。
本当にごめんなさい。
NodeJSで動かします、Gulpは。
サーバー側(というかコマンドライン)で動かすと、ファイル出力もできるのな。
マジですごいぜ、JS。

さて、表記をいってみよう。
Gulp入れても、マシンを立ち上げて、
ファイル変更の監視を起動するのは、少々面倒だ。
そこで、それを自動化しようってのが今回のエントリー
今回のは、Windows Script Host(以下WSH)のjScriptを使ってやるので、
Windows限定です。
Macでも、AppleScript、JXAを使えば同じことができるはず。(多分WSHより簡単にな)
WSHとは、OSの操作を、スクリプトから自動実行できるってやつ。

Gulpは導入済み、watchで監視もできること前提で話進めますよー
Gulpの導入ファイル監視、のやり方は左記リンク)

まず適当に、テキストエディタにて、下記スクリプトを書いて、
てきとうに名前をつけて保存する。
(ファイルの保存ディレクトリは、ドライブルートからたどっても半角英数字のみのパスになるような場所が望ましい。なぜなら、jScriptがShift-jisじゃないとうまく動かせないから)

// Get WSH Object
var $wsco = WScript.CreateObject('Shell.Application'),
  $sh = new ActiveXObject('WScript.Shell'),
  $cmdApp = null;
var $cmdSrc = "\"C:/Windows/System32/cmd.exe\"";

function $appStartFunc(startFlg, cmdFlg){
  if (startFlg) {
    // cmp.exe Start
    $sh.Run($cmdSrc, 1);
  } else {
    if ($cmdApp) {
      var result = $cmdApp.Terminate();
    }
  }
}

function $connectFunc() {
  var locator = WScript.CreateObject('WbemScripting.SWbemLocator.1');
  return locator.ConnectServer();
}
// cmd Insert in Value
function $searchingProcessFunc(){
  var service = $connectFunc();
  var set = service.ExecQuery('select * from Win32_Process');
  for (var i = new Enumerator(set); !i.atEnd(); i.moveNext()) {
    var p = i.item();
    if (p.Caption == 'cmd.exe'){
      $cmdApp = p;
      break;
    }
  }
}

$searchingProcessFunc();

// Last Func
function $nextActionFunc() {
  // Moved First View at CommandPronpt
  $sh.AppActivate($cmdApp.Caption);

  // To hit keys
  var stKeys = "cd C:\\Program Files\\nodejs\\".split('');
  var datKey = "nodevars.bat".split('');

  for (var i = 0; i < stKeys.length; i++) {
    $sh.SendKeys(stKeys[i]);
    if (stKeys.length == i +1) {
      $sh.SendKeys('{ENTER}');
      WScript.Sleep(200);
    }
  }

  for (var iD = 0; iD < datKey.length; iD++) {
    $sh.SendKeys(datKey[iD]);
    if (datKey.length == iD +1) {
      $sh.SendKeys('{ENTER}');
      WScript.Sleep(200);
    }
  }

  $sh.SendKeys('D');
  $sh.SendKeys(':');
  $sh.SendKeys('{ENTER}');
  WScript.Sleep(200);

  var gulpSrc = "cd D:\\save_data\\var\\www\\gulp_files".split('');
  for (var iG = 0; iG < gulpSrc.length; iG++) {
    $sh.SendKeys(gulpSrc[iG]);
    if (gulpSrc.length == iG +1) {
      $sh.SendKeys('{ENTER}');
      WScript.Sleep(200);
    }
  }

  var gulpWatchCmd = "gulp watch".split('');
  for (var iGS = 0; iGS < gulpWatchCmd.length; iGS++) {
    $sh.SendKeys(gulpWatchCmd[iGS]);
    if (gulpWatchCmd.length == iGS +1) {
      $sh.SendKeys('{ENTER}');
      WScript.Sleep(200);
    }
  }

  WScript.Sleep(5000);
  $sh = null;
}

if ($cmdApp) {
  // Starting Cmd
  $nextActionFunc();
} else {
  // Start & Set Values
  WScript.Echo('Not Start');
  $appStartFunc(true);
  $searchingProcessFunc();
  WScript.Sleep(5500);
  $nextActionFunc();
}

スクリプトの細かい説明はここでは省く。
環境によって違う部分だけ、説明する。
まず、5行目のコマンドプロンプトのパス

43行目、これは、コマンドプロンプトをNodeJSモードに変えるためのDatファイルの実行。
この次の行のforで、コマンドを実行している。
このコマンドは、コマンドプロンプトを実行して、すぐに、
gulpコマンドが実行できる状態ならやる必要がない。
(npmのインストール状況などで変わるっぽい)
素のコマンドプロンプトで実行できないときは、
NodeJSを通す必要がある。

62~67行目、Gulpをローカルインストールしているディレクトリをたどるためなので、
当然、環境によってパスが変わる。

いずれの環境によって変わる行も、jScriptによって、自動的にキーボードを叩いて、コマンドを実行している部分だ。

さて、この保存したjScriptを実行するにはどうするかというと、
コマンドプロンプトへのショートカットに、自動的にjScriptを実行するようにする。

まずは、ショートカットを作る。
スタートメニュー>すべてのプログラム>アクセサリ>コマンドプロンプト
のところで右クリック、送る>デスクトップ(ショートカットを作成)で、デスクトップにショートカットを作成する。

できたショートカットを右クリックして、プロパティ、ショートカットタブのリンク先にて、起動後、速攻でコマンドを実行するようにする文を追加して、OKボタンを押す。

C:\Windows\System32\cmd.exe /k "cscript 作ったjScriptへのパス\auto_gulp_watch_start_ws.js"

これで、このショートカットを起動すれば、Gulpのwatchメソッドが実行されるようになった。
あとは、このショートカットをスタートアップに保存しておけば、
マシン起動時にスタートさせたりもできる。

Gulpもそうなんだけど、やっぱ、OSスクリプトは便利だね。
勉強する価値がありますな。
GulpもJSだし、どんどん勉強していきます。
JSベースのOSスクリプトもどんどんやっていきたい。

トラックバック(0)

トラックバックURL:

コメントする