gulpについて、いろいろググってみたけど、どうも情報がばらついていて、いいまとめサイトがないので作ってみた：仮

# gulpとは
本家はここ
http://gulpjs.com/

概要についてはここ
[gulp.jsで始めるWeb開発爆速自動化入門：便利なGruntの弱点を補うgulp.jsのインストールと使い方 (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1408/19/news035.html)

大雑把に言いうと、js,cssファイルを圧縮したり、他の言語をコンパイルしたり、
ブラウザを勝手にリロードしてくれるサーバーを立ち上げたり、普段の作業を自働化するようにできるツール。

gulpfile.jsにいろんなタスクを記述し、ワンコマンドで呼び出しが可能。

![gulp.PNG](https://qiita-image-store.s3.amazonaws.com/0/47047/93ccf32d-bd97-24c9-bb63-20e34282fccc.png)
[http://gulpjs.com/](http://gulpjs.com/)


# 普段使うであろう、絶対に押さえておきたいgulp API
ここのセクションについては、
[gulp.jsで始めるWeb開発爆速自動化入門：便利なGruntの弱点を補うgulp.jsのインストールと使い方 (2/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1408/19/news035_2.html)
を参考にした

## タスクを定義――gulp.task(name[, deps], fn)
タスクを定義する。第2引数には依存するタスクを配列で記述でき、タスク実行前に実行される

```js
gulp.task('mytask', ['array', 'of', 'task', 'names'], function() {
  // Do stuff
});
```

## 入力対象となるファイル群を指定――gulp.src(globs[, options])
入力対象となるファイル群を指定します。glob引数に指定できる形式は、
「[node-glob](https://github.com/isaacs/node-glob)」のシンタックスである。つまり、ここの、「node-glob」のオブジェクトが返されているということ。
src関数で指定したファイル群をpipe関数でつなぎ、タスクを実行していく。

```js
gulp.task('mytask', ['array', 'of', 'task', 'names'], function() {
  gulp.src('src/**/*.html')
    .pipe(foo())
});
```
foo()は、プラグインの関数である。

## タスク名を指定して実行――gulp.run(tasks…[, cb])
タスク名を指定することで、対象のタスクを実行できます。

```js
//fooタスク内でbarタスク実行
gulp.task('foo', function(event) {
    gulp.run('bar');
});
```

## 出力先となるパスを指定――gulp.dest(path)
出力先となるパスを指定します。
pipe関数から流れてきた情報をファイルに出力することができる。

## ファイル群を監視――gulp.watch(glob, cb)
指定されたファイル群を監視し、ファイルが更新された場合に第2引数の関数を実行する。

```js
//jsファイルが更新されたらメッセージ表示
gulp.watch('**/*.js', function(event) {
    console.log("js file changed!");
});
```

このままgulpfile.jsに記述すると、いつも監視状態になってしまうので、通常は、

```js
gulp.task('foo', function(event) {
    gulp.watch('**/*.js', function(event) {
        console.log("js file changed!");
    });
});
```
のように、```gulp.task```内に記述する。
これで、

```bash
gulp foo
```
で呼び出せる。
習慣的にこちらをつかう。

### gulp.srcをもう少し、深く説明
一番重要であろう(もっともよく使う)、```gulp.src(globs[, options])```について深く説明する。これは、「[node-glob](https://github.com/isaacs/node-glob)」のシンタックスであるから、ファイルの指定方法は、gulpのdocsには、存在しない。
これを知るには、[https://github.com/isaacs/node-glob](https://github.com/isaacs/node-glob)に見に行く必要がある。

重要な部分だけ少し翻訳する。
間違っている可能性もあるが、わかった時に修正する。

--------------
# Glob Primer
"Globs" は、```ls *.js```とコマンドを打つときや、```.gitignore```に```build/*```と打つときのパターンである。

Globには、ブラケットセクションがある。これは、```{```から始まり、```}```で終わる部分である。この部分は、解析される前に展開される。

それは、例えば、```a{/b/c,bcd}```は```a/b/c```と```abcd```に展開される。

そのほかに、パターンを表すのに以下のような表現方法がある。

- ```*```0個以上の文字にマッチします
- ```?```1つの文字にマッチします
- ```[...]```正規表現の範囲を表します。```[```の直後に```!```や```^```をつけると、否定の意味になります。
- ```!(pattern|pattern|pattern)``` このパターンにはどれもマッチしなくなります。
- ```?(pattern|pattern|pattern)``` 中の文字列に０もしくは１回だけマッチします。
- ```+(pattern|pattern|pattern)``` 中の文字列に０回以上の繰り返されている部分にマッチします。
- ```*(a|b|c)``` a,b,cのどれかで構成された文字列を表します。
- ```@(pattern|pat*|pat?erN)``` どれかのパターンにマッチします。
- ```**``` globstarと呼ばれ、０以上のディレクトリの階層にマッチします。

--------------

全体的な意味はこんな感じである。
端折って書いたり順番を入れ替えたりしている



# さらに詳しい情報が知りたい人は、この本家のサイトへ
[gulp/API.md at master · gulpjs/gulp](https://github.com/gulpjs/gulp/blob/master/docs/API.md)

# gulpの用法を一通り知りたい人は、このサイトを一読するとよい
[タスクランナーgulp.js最速入門 - id:anatooのブログ](http://blog.anatoo.jp/entry/20140420/1397995711)

# gulpを使って、