GruntとBowerを使ってWeb開発用のテンプレートを作成する

GruntとBowerがおもしろそうだったので試してみました。

はじめに

GruntはSassやCoffeeScriptのコンパイルやテスト実行などのタスクを自動化してくれるツール、BowerはCSS/JavaScriptのパッケージ管理ツールという感じ。Bowerは指定したバージョンのパッケージのダウンロードまではやってくれるけれど、GitHubのリポジトリ毎ダウンロードされるものもあるようで、必要なファイルの抽出とかまではやってくれない。そこで、GruntのタスクでBowerの実行からファイルの抽出までを自動化してみる。

インストール

GruntはNode.js上で動作するので、最初にnvmを使ってNode.jsをインストールする

nvmのインストール

GitHubのリポジトリをクローンして、zshenvに設定を追記する。

% git clone git://github.com/creationix/nvm.git ~/.nvm
% vi ~/.zshenv
[[ -s $HOME/.nvm/nvm.sh ]] && source $HOME/.nvm/nvm.sh
% nvm -v

Node.jsのインストール

nvmを使ってNode.jsをインストールする。最新の安定版を利用した。

% nvm install v0.10.13
% nvm alias default v0.10.13
% node -v
v0.10.13

grunt-cliをインストールする

node.jsのパッケージ管理ツールnpmを使ってBowerをインストールする。-gオプション付きだとグローバルでインストールされる。テンプレートごとに管理したいモジュールはオプションなしでローカルにインストールする。

% npm install -g grunt-cli

Bowerのインストール

同じくnpmを使ってBowerをインストールする。

% npm install -g bower

Gruntモジュールのインストール

npm initコマンドを実行すると、package.jsonが作成される。このファイルにインストールするGruntモジュールを記載する。npm innstallコマンドの実行でGruntモジュールがnode_modulesディレクトリ配下にインストールされる。package.jsonを直接編集しなくても、npm install grunt --save-devのようにすると、インストールと同時にpackage.jsonへの追加もしてくれる。

% npm init
いろいろ聞かれるので入力する

% vi package.json
{
  "name": "web_template",
  "version": "0.0.0",
  "description": "",
  "main": "",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "yukihir0",
  "license": "MIT",
  "devDependencies": {
    "grunt": "~0.4.1",
    "grunt-bower-task": "~0.2.3",
  }
}

% npm install

Bowerでパッケージのダウンロード

bower initコマンドを実行すると、bower.jsonファイルが作成される。Gruntと同じ要領で、bower install bootstrap --save-devのようにすると、ダウンロードと同時にbower.jsonへの追加もしてくれる。パッケージはbower_componentsディレクトリにダウンロードされる。

% bower init
いろいろ聞かれるので入力する

% bower install bootstrap --save-dev
% bower install backbone --save-dev
% bower install underscore --save-dev
% bower install jquery --save-dev

% vi bower.json
{
  "name": "web_template",
  "version": "0.0.0",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "tests"
  ],
  "devDependencies": {
    "bootstrap": "~3.0.0-rc1",
    "backbone": "~1.0.0",
    "underscore": "~1.5.1",
    "jquery": "~2.0.3"
  }
}

Gruntタスクの設定

GruntのタスクはGruntfile.jsに記載する。libディレクトリ配下にファイルをコピーするようにしてみた。コピーするファイルはbower.jsonに記載を追加する。記載が終わったら、gruntコマンドでタスクが実行できる。

% vi Gruntfile.js

module.exports = function (grunt) {
  'use strict';
  grunt.initConfig({
    pkg: grunt.file.readJSON("package.json"),
    bower: {
      install: {
        options: {
          targetDir: './lib',
          layout: 'byType',
          install: true,
          verbose: false,
          cleanTargetDir: true,
          cleanBowerDir: false
        }
      }
    },
  });
  grunt.loadNpmTasks('grunt-bower-task');
  grunt.registerTask('default', ['bower:install']);
};

% vi bower.json

{
  "name": "web_box",
  "version": "0.0.0",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "tests"
  ],
  "devDependencies": {
    "bootstrap": "~3.0.0-rc1",
    "backbone": "~1.0.0",
    "underscore": "~1.5.1",
    "jquery": "~2.0.3"
  },
  "exportsOverride": {
    "bootstrap": {
        "js": "dist/js/bootstrap.min.js",
        "css": "dist/css/bootstrap.min.css"
    },
    "backbone": {
      "js": "backbone-min.js"
    },
    "underscore": {
      "js": "underscore-min.js"
    },
    "jquery": {
      "js": "jquery.min.js"
    }
  }
}

% grunt

初期状態から実行する

ここまでで作成したpackage.json、bower.json、Gruntfile.jsをリポジトリに格納しておけば、npm installとgruntコマンドの実行で指定したバージョンの必要なパッケージがしかるべきディレクトリにダウンロードされる。すばらしい!!

% npm install
% grunt

まとめ

GruntとBowerを使って、CSS/JavaScriptパッケージのダウンロードと抽出を自動化してみた。こんな感じで必要なパッケージを追加してけば、自分用のWeb開発テンプレートが作成できる。Gruntモジュールにはテスト実行やWebサーバLiveReloadをしてくれるものもあるみたいなので試してみたい。