ほんじゃらねっと

ダイエット中プログラマのブログ

WindowsのタスクスケジューラからGruntスクリプトを起動する方法

f:id:piro_suke:20160422003356j:plain

どうせ自動化するなら完全自動化したいよね、

ということで今回は作成したGruntスクリプトを

Windowsの起動時や毎日の決まった時間に実行できるように

タスクスケジューラに登録する方法を紹介する。

この記事はGruntを実行する環境が整っていることを前提としているので、

未インストールの方は下記の記事を参考にしていただきたい:

blog.honjala.net

タスクスケジューラの基本的な使い方は下記のページに

詳しく掲載されている:

https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=015385

タスクスケジューラはパスさえ指定すれば色々な

プログラムを実行してくれるのだけど、

Gruntスクリプトを実行する場合はちょっと工夫する必要がある。

サンプルとして、下記のような

始業時間をチャットワークに通知する簡単なGruntスクリプト

の実行を自動化する形で説明する。

Gruntfile.js

module.exports = function(grunt) {
    grunt.initConfig({
        http: {
            notify: {
                options: {
                    url: "https://api.chatwork.com/v1/rooms/<チャットワークのルームID>/messages",
                    method: "POST",
                    headers: {
                         "X-ChatWorkToken": "<チャットワークのAPIキー>"
                    },
                    form: {
                        body: "9時です。仕事を始める時間だよ!" 
                    }
                }
            }
        }
    });
    
    grunt.loadNpmTasks("grunt-http");
    grunt.registerTask("default", "http:notify");
};

上記のスクリプトを手動で実行する場合は、

コマンドプロンプトでこのファイルを置いたフォルダに移動して、

grunt

もしくは

grunt http:notify

というコマンドを実行する。

これと同じことをタスクスケジューラに実行させたら良いわけだ。

すぐ思いつくけどうまくいかない方法

うまくいかない方法を書いて何か意味があるのか、

という話だが、Grunt以外のプログラムならこの方法で

実行できるかもしれないので、書いておく。

上記のリンクに説明されている方法で

タスクの作成を進めていくと、

「プログラムの開始」のところで

  • プログラム/スクリプト
  • 引数の追加
  • 開始

という設定を行うことができる。

今回のサンプルでいうと、

「プログラム/スクリプト」はgruntコマンドなので、

gruntコマンドのパスを渡す。

gruntコマンドは環境によるかもしれないが、

私の環境では下記のパスに保存されていた:

C:\Users\ユーザー名\AppData\Roaming\npm\grunt

「引数」はプログラムに渡すパラメータなので、

今回のサンプルの場合は、何も渡さないか、

http:notify

を渡す。

「開始」は分かりにくいが「プログラムを実行する場所」を指すので、

下記のような感じでGruntfile.jsを置いたフォルダのパスを渡してやる:

C:\Users\ユーザー名\workspace\task_schedule_test

これで設定はバッチリと思われるのだが、

いざ実行してみると、うまくいかない。

タスクスケジューラ上ではプログラムを起動したらしきログが残るが、

エラー終了してチャットワークにもメッセージは届かない。

(このやり方でうまくいく方法をご存知の方がいたら教えていただきたい)

面倒だけどうまくいく方法

ということで上記の方法を諦めて色々考えた結果、

「バッチファイルの中からgruntコマンドを実行したらうまくいくんじゃない?」

と思いついたので試してみた。

先ほどのGruntfile.jsと同じ場所に、

下記のようなbatファイルを作成して保存する:

grunt_task.bat

@echo off

cd C:\Users\ユーザー名\workspace\task_schedule_test
C:\Users\ユーザー名\AppData\Roaming\npm\grunt

書いてる内容は、上でタスクスケジューラに設定した内容と同じで、

task_schedule_testフォルダに移動して

gruntコマンドを実行しなさい、という内容だ。

このgrunt_task.batのパスを

タスクスケジューラの「プログラム/スクリプト」に設定する。

この方法だとうまくいくようだ。

9:00になったらチャットワークにメッセージが投稿された。

おわり

謎は残ったが、

ひとまずタスクスケジューラからgruntを実行することはできた。

自動化する方法をお探しの方は試してみていただきたい。