タスクランナー起動用のバッチファイルを作る

タスクランナー起動用のバッチファイルを作る

久々にgulp触ったらバージョンが3から4になってて、
gulpfile.jsをあっちゃこっちゃ書き直さないといけなくなってしまった……。
え?今時まだgulp使ってんのって? ウルサイナー、案件の都合だよう。

やりたいこと

毎回毎回コマンドプロンプト立ち上げて『gulp』って打つことすらめんどくなってきたので、
バッチファイルにしてワンクリックで起動させるようにします。
ついでにGit経由で他の環境とかで起動する場合もよしなにやってくれるように調整しておく。
自分がWindowsの民なのでコマンドプロンプトって書いてますが、マカーな方はターミナルを思い浮かべてください。

こんな感じが目標。

  • ワンクリックでタスクランナーを起動するbatchファイルを作る
  • node_modulesが存在しない場合は、『npm install』でもろもろ構築する
    (node_modulesディレクトリはGitの監視外としてローカルに生成した方がスマートなため)
  • そもそもNode.jsやGulpがインストールされていない場合は何かそれっぽいエラーを出す

node_modulesってのはNode.jsのパッケージが諸々詰め込まれるフォルダのことで、
中身を直接触ってどうこうすることはないため(ないよね?)
Gitで管理対象から外すとよいです。

Git+タスクランナーでのディレクトリ構造を考える

ちょっとコマンドプロンプトのことを忘れて一旦Gitの頭にしてください。
今回の例では、リポジトリのクローン直後にこんなディレクトリ構造になると仮定します。

project/
 ├ src/
 │ ├ pug/
 │ ├ sass/
 │ ├ js/
 │ └ uncompressed_img/
 ├ dist/
 │ └ js/
 │  └ lib/
 ├ package.json
 ├ gulpfile.js
 ├ start.bat ← これから作る
 └ .gitignore

また、.gitignoreの記述例も記載しておきます。

/node_modules
/.git
/dist/*
!/dist/lib

突然Gitがどうのとか言いだしてなにいってだって感じかもしれませんが、

srcディレクトリ:PugやSass、圧縮前画像など。当然各ファイルをバージョン管理する
distディレクトリ:HTMLやCSS、圧縮後の画像など、変換後のファイルが出力される
変換前のファイルがあるならバージョン管理しなくてもよくない??
(でもJSライブラリは圧縮とかしないしそこだけ除外しよ)

という発想でこのような例を挙げましたよー、って話です。
タスクランナーの起動を自動化することが本記事の目的ですが、
それによって生成されたバージョン管理する必要のないファイルは極力無視したい
という裏のテーマがあるってことでしゅ。

とりあえず理念的な話は済んだのでGitのことはもう忘れていいです。

作業フローの改善

上記の例を踏まえて、これまではタスクランナーの初回起動時は
下記のようなそれなりに面倒な工程が必要でした。

  1. 対象の作業ディレクトリ(今回の例だと/project/フォルダ)に、
    リモートリポジトリからクローンを行う。上記構成図のような状態になる。
  2. コマンドプロンプトを起動し、上記作業フォルダにカレントディレクトリを設定。
    (入力例:『cd C:\test_site\project』)
  3. 『npm install』と入力すると、node_modulesが生成される。
    ※Node.jsやGulpの諸設定は済んでいるものとする
  4. この状態で起動コマンド(今回の例なら『gulp』)を入力すると、ようやく諸々の処理が走る。
    ※package.jsonやタスクランナーの設定ファイル(今回はgulpfile.js)の記述は適切なものとする

これを、こうする!

  1. リモートリポジトリからクローン(ここは変わらない)。
  2. バッチファイル(start.bat)をクリックしたら、タスクランナーが起動して処理開始。

…ってのが目標でス。
ゆえに、これからstart.batに色々書いていきましょうという流れになります。

実際にやってみた

ステップ1 とりあえずワンクリック起動

とりあえずコマンドプロンプトを起動する手間を省きたい人向け。
Gitとか使わないしぃ~、一回初期構築したらもう他のPCで作業とかするつもりないしぃ~
ってな人はこれでおしまいでもいいです。

@echo off
cd /d %~dp0
cmd /k gulp

@echo offは不要な表示を消してくれるおまじない的なやつです(省いてもよい)。
二行目でカレントディレクトリを指定して、三行目でgulp起動というシンプルな内容になります。

なおGrunt使ってる人は三行目が『cmd /k grunt』になったり、
憔悴ニキ(?)の場合は『cmd /k npm run』なったりします。

ステップ2-1 初期構築もやってもらう

初期構築、すなわち「npm install」のやつも自動でやってもらいましょう。
package.jsonに書かれてるもろもろをインストールする工程ですね。

@echo off
cd /d %~dp0
rem node_modulesフォルダがない場合、npm installコマンドを実行
if not exist node_modules\nul (
  call npm install
)
cmd /k gulp

node_modulesフォルダがなければnpm installから始めて、終わったらwatch処理が走ります。
(remってやつはコマンドプロンプトにおけるコメントです)

…しかし、今回の例の場合はこれだけだと正しく動作しません。
なぜなら、Git上では元ファイルしか管理しないという先述の都合上
npm installを行った段階では/dist内の各ファイルが生成されていない状態だからです。

ステップ2-2 初回のファイル生成も自動化

『npm install』後、/dist/index.htmlがなければ『gulp dist』で
/dist配下のファイルやフォルダを生成するようにしました。
ついでにコマンドプロンプト上に説明テキストも表示。

『gulp dist』って何さって話ですけども、タスクランナーの設定ファイル(gulpfile.js)に
もろもろ出力するための記述を書いといた感じです。
長いけどこんなんです(109行目参照)。

watchタスクは対象のファイルが”変更されたら”行われる内容なわけですが、
npm install直後だと.sassや.pugファイルが更新されることはないでしょう。
なので、初回起動時用に諸々のファイルを出力するタスクも設定しておく必要があったわけです。
理屈としてはGruntでもnpmでも同じなので適宜処理を書いておいてくだしあ。

ステップ3 エラーを添える

ついでにnpmやgulpコマンドが使えない環境でバッチファイルを起動した場合は、
それっぽいエラーを表示させるようにします。

npmコマンドが使えない場合は:error01、
gulpコマンドが使えない場合は:error02の内容を表示させるようにしました。

なんとバッチファイルに関数なんてものはないので、
gotoによるゴリ押しソリューションとなっております。

終わりに

いかがでしt…おっと、これで締めくくると警告されちゃうんだった。
平成の始まりに集合知の象徴と謳われたインターネットなんてものも今や完全に崩壊して
イナゴの群れが夢の跡なマッポーワールドになってしまったんですわ。
あれ? 何の話してたんだっけ。

…えーと。エンジニアならさておき、Web屋的には黒い画面に触れる機会はあまり少ないかと。
出来ることなら触りたくないなーって人も多いかなーと思ったので、
気を効かせてバッチファイルなんぞ自作してみた次第であります。

また、今回はGit導入が前提の作業フローを想定しているためこんな感じの内容になりましたが、これが個人作業だとまた違った感じになってくると思います。
node_modulesディレクトリをプロジェクトを跨いで読み込みたい!とかなったりね。
そういう場合はバッチファイルの設定もまた変わってくることかと思います。

まあここまで真面目に書いといてアレなんですが、バッチファイルの作成なんて
所詮一工程の効率化のために行われるものであって、別に必須の仕事ではないわけです。
こうした僅かな効率化のために半日費やす羽目になったりするのはアホなので(ブーメラン)、
進捗が求められる場面では多少非効率でも無心で作業を行うことも選択の一つではある、
と付け加えておきます。

おまけ

今回の例のようなディレクトリ構造Fomantic UIってフレームワークを使う機会がありまして。
(去年の8月で更新が途絶えてるSemantic UIを有志が引き継いで開発してるやつ…だと思う)

『npm install』時に初期設定を尋ねられるんですが、これも省略したいなあと思ったんですよね
(どうせ無視してEnterキー数回押すだけだし)。
ついでに言えば、フレームワークを直接弄ってどうこうすることはないですし、
こいつもGit監視の対象外にしたかったんで、下記のようなことをしました。


・semantic.jsonという設定ファイルの記述を変更
“autoInstall”: trueという記述を加筆して、npm install時の設定入力が省けるようにします。
また、.cssや.jsファイルの出力先を/dist/lib/semantic/配下に設定しておきます。
(”source”部分はどうでもいいので変更しない)

・.gitignoreを変更
/semanticフォルダとsemantic.jsonにて指定したフレームワーク関係の出力フォルダを
Git監視外に設定。

/node_modules
/.git
/dist/*
!/dist/lib
/dist/lib/semantic
/semantic

なお、Fomantic UI(Semantic UI)だからこんなんで済んでますけど、どうやら
Bootstrapの場合もっとダルそうなので、Sassファイル側で
/node_modules/bootstrap/配下を@importさせるのがいい
っぽい。
試したことないから知らんけどー。

個人的にはそもそもCSSフレームワークなんて要らなくない?派なんである。
!importまみれのルールセットの何がありがたいんだか~…なんて毒づいてみたり。