gruntの基本的な機能
gruntってなに
本家のHPいわく、
Grunt is a task-based command line build tool for JavaScript projects(http://gruntjs.com/)
ということでJavaScript周りのツールらしい。
具体的に何をやっているの?
githubのドキュメンテーションを見ると基本的に使える機能は
- concat
- init
- lint
- min
などがある。
それ以外でもプラグイン的なものが配布されているので基本で満足できない人は機能の拡張をすることができるらしい。
まずはディレクトリの作り方
test ├js │├all.js │└_core │ ├sample1.js │ └sample2.js ├grunt.js └index.html
grunt.js fileの場所についてだが、
ドキュメンテーションによると、gruntが実行されたディレクトリ内でgrunt.jsというgruntfileを探して現在のディレクトリにgruntfileがなければその親フォルダを、なければその親フォルダを、、、というようにファイルが見つかるまで親ディレクトリを探し続ける。
そのため、というようにgrunt.jsをフォルダの一番上においていおくのが流行っているらしい。
grunt fileの中身
まず、例として以下のファイルを見てみる。
module.exports = function(grunt) { // Project configuration. grunt.initConfig({ lint: { all: ['grunt.js', 'js/_core/sample1.js', 'js/_core/sample2.js', 'js/all.js'] }, jshint: { options: { browser: true } } }); // Load tasks from "grunt-sample" grunt plugin installed via Npm. grunt.loadNpmTasks('grunt-sample'); // Default task. grunt.registerTask('default', 'lint sample'); };
上から見ていくと
module.exports = function(grunt) { // gruntの記述 };
というような記述でgrunt fileを書き始めるのがgrunt fileのルールだ。
次にgruntの基本機能の記述について見ていく
grunt.initConfig({ // gruntの基本機能 //lint やconcatなど });
プラグイン
grunt.loadNpmTasks('grunt-sample');
これはgrunt-sampleというプラグインを読み込んでいる。
このプラグインを読み込むときは事前にターミナルで
$ npm install grunt-sample
のコマンドを入力し、プラグインをインストールしておく必要がある。
ただひとつ問題があって、プラグインをインストールする先だが、grunt.jsがあるディレクトリにインストールしなければいけないらしい。なので、毎回新しく作業をはじめるごとにそのディレクトリでそのプラグインをインストールしないと。。。めんどくさい。。
実行
今回の場合
grunt.initConfig({ lint: { all: ['grunt.js', 'js/_core/sample1.js', 'js/_core/sample2.js', 'js/all.js'] }, jshint: { options: { browser: true } } });
gruntfileが上記のようになっているため、lintとjshintというタスクを実行することができる。
今回、lintだけを実行する
ターミナルを開いて
以下のコマンドを打つだけ!
$ grunt lint
これはgrunt fileでlintというタスクを設定しているので、それを実行しますよということだ。
lintの結果エラー箇所がないと以下のようなログが出力される。
Running "lint:all" (lint) task Lint free. Done, without errors.
エラーがあると以下のようログが出てしまう。
Running "lint:all" (lint) task Linting sample1.js...ERROR [L34:C2] Missing semicolon. } <WARN> Task "lint:all" failed. Use --force to continue. </WARN> Aborted due to warnings.
これはsample1.jsの34行目の2列でセミコロンを忘れているので失敗しました
ということを表している。ので、エラー箇所を直して再度実行
すると、
grunt.js js/_core/sample1.js js/_core/sample2.js js/all.js
がlintされる。
grunt.initConfigの基本的な機能
// Project configuration. grunt.initConfig({ // メタデータを記述 meta: {}, // ファイル結合 concat: {}, // JSHintを用いてlintを実行 lint: {}, // UglifyJSを用いてminifyを実行 min: {}, // QUnitを用いてtestを実行 qunit: {}, // "server" として振る舞う server: {}, // Nodeunitを用いてtestを実行 test: {}, // 監視タスクを実行 watch: {}, // JSHintのグローバル設定オプション jshint: {}, // UglifyJSのグローバル設定オプション uglify: {} });
これらを使ってgruntfileを構成していく。
この中で自分が使いそうなtaskは
- watch
- concat
- min
くらいかな。。。
なんかwatchがすごく便利そうなので少し詳しく見ていく。
watchタスク
以下のようなgrunt.jsを記述する。
grunt.initConfig({ concat: { dist: { src: ['js/_core/sample1.js', 'js/_core/sample1.js'], dest: 'js/all.js' } } min: { dist: { src: ['js/all.js'], dest: 'js/all.min.js' } watch: { files: [ 'js/_core/*.js' ], tasks: 'concat min' }, });
このファイルに対してターミナルで、
$ grunt watch
を実行すると、js/_coreのディレクトリにあるjsファイルが変更された時にconcat,minタスクを実行するというものだ。
つまり、jsファイルにに変更を加えるとそれらがall.jsというファイルにまとめられて,minifyされたall_min.jsというファイルが生成されるのだ。
なので、とりあえず作業をするときはこのへんの設定を先に行なってしまうと、作業がサクサクとすすめられそう。