tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【node.js】node.jsのリリース状況やLTS(Long-Term-Support:長期サポート)やEOL(End-of-Life:サポート終了)を知る

はじめに

node.jsやその周辺のversionが合わなくて環境がおかしい...
そんなときにリリース状況やサポート状況を知りたい自分用メモです。

どこで知るか

以下で知れます

どんな感じか

この記事時点での、ですがこんな感じで見れます。

Release schedule

f:id:tweeeety:20180608180056p:plain

https://github.com/nodejs/Release#release-schedule

End-of-Life Releases

f:id:tweeeety:20180608180104p:plain

https://github.com/nodejs/Release#end-of-life-releases

おわり

意外に探そうと思った時ぐぐってもぱっと出てこない自分がいます...w
\(^o^)/

シェルスクリプトやbashでset -eしたまま処理を中断せずに続けるメモ

はじめに

シェルスクリプトで意図せずエラー時に処理を中断させたい場合にset -eを使います。

set -eしつつ、意図したエラーであれば処理を先に進めたい場合のメモです。

アジェンダ

  • どうやるか
  • 具体例
  • 使い所

どうやるか

&& true を使います。

いくつか方法はあるのですが、自分的にはこれだけ使ってます。

具体例

サンプル

以下のようなシェルスクリプトサンプルで説明します。

  • stop.sh
$ cat stop.sh
#!/bin/bash

set -e

echo "hoge" # あってる
ehco "fuga" # echoをスペルミス
echo "piyo" # あってる
  • そのまま実行した場合
$ ./stop.sh
hoge
./stop.sh: line 4: ehco: command not found

piyoが出力されずに処理が中断されます。

&& trueを使う

  • stop.shを以下のように変更します
$ cat stop.sh
#!/bin/bash

set -e

echo "hoge" && true
ehco "fuga" && true
echo "piyo" && true
  • 実行
$ ./stop.sh
hoge
./stop.sh: line 6: ehco: command not found
piyo

piyoまで出力されました。

おわり

ちょいスクリプトにこそエラーハンドリングがっつり書くよりはset -eですませたい。
でもここで処理は中断したくない!ってことはまぁまぁあります。
横着しすぎ説\(^o^)/

シェルスクリプトやbashの処理を中断する3パターンの`-e` - とアンチパターン

はじめに

シェルスクリプトを書いていて
予想外の失敗時に処理が先に進まないでほしい
場合に処理を中断してほしいことがありますよね。

そんなときのメモ

アジェンダ

どうやるか

-eオプションをつけます。

-eをつけることで、exit 0(正常ステータス)
以外が返る場合に処理を中止するようになります。

どう使うか

-eオプションでの実行は何パターンかあります

  1. bashコマンドのオプションにつけてシェルスクリプトを実行する
  2. シェルスクリプトshebangにつける
  3. シェルスクリプト内で"set -e"を呼ぶ

具体例

サンプル

以下のようなシェルスクリプトサンプルで説明します。

  • stop.sh
$ cat stop.sh
#!/bin/bash

echo "hoge" # あってる
ehco "fuga" # echoをスペルミス
echo "piyo" # あってる
  • そのまま実行した場合
$ ./stop.sh
hoge
./stop.sh: line 4: ehco: command not found
piyo

line 4: ehco: command not found とは表示されますが、
piyoまで出力されています。

1. bashコマンドのオプションにつけてシェルスクリプトを実行する

シェルスクリプトの実行時にbashコマンド + -eで実行します

$ bash -e stop.sh
hoge
stop.sh: line 4: ehco: command not found

piyoが出力されずに処理が中断されました。

2. シェルスクリプトshebangにつける

シェルスクリプトの冒頭に記載する#!/bin/bash-eをつけます

  • stop.shを以下のように変更します
$ cat stop.sh
#!/bin/bash -e

echo "hoge" # あってる
ehco "fuga" # echoをスペルミス
echo "piyo" # あってる
  • 実行
$ ./stop.sh
hoge
./stop.sh: line 4: ehco: command not found

piyoが出力されずに処理が中断されました。

3. シェルスクリプト内で"set -e"を呼ぶ

シェルスクリプトの冒頭でset -eします。

  • stop.shを以下のように変更します
$ cat stop.sh
#!/bin/bash

set -e

echo "hoge" # あってる
ehco "fuga" # echoをスペルミス
echo "piyo" # あってる
  • 実行
$ ./stop.sh
hoge
./stop.sh: line 4: ehco: command not found

アンチパターン

しかし、注意することがあります。

2. シェルスクリプトのshebangにつけるbashコマンドで呼び出すとうまくいきません。

  • stop.sh
$ cat stop.sh
#!/bin/bash -e

echo "hoge" # あってる
ehco "fuga" # echoをスペルミス
echo "piyo" # あってる
  • 実行
# そのまま実行
$ ./stop.sh
hoge
./stop.sh: line 4: ehco: command not found

# bashコマンドで呼び出し
# piyoまで出力されてしまう
$ bash ./stop.sh
hoge
./stop.sh: line 4: ehco: command not found
piyo

これだと意図せず中断したいから大丈夫だろうと思いつつ
意図せず続いてしまうのでだいぶむしろ怖いです。

3. シェルスクリプト内で"set -e"を呼ぶのほうは大丈夫です

$ cat stop.sh
#!/bin/bash

set -e

echo "hoge" # あってる
ehco "fuga" # echoをスペルミス
echo "piyo" # あってる

$ ./stop.sh
./stop.sh
hoge
./stop.sh: line 6: ehco: command not found

$ bash stop.sh
hoge
stop.sh: line 6: ehco: command not found

合わせて

おわり

set -eは若干の賛否両論はありますが、 意図せず処理を続けることがないようにしたい場合は
シェルスクリプト内にset -eするのが安心です\(^o^)/

【node.js】macにnodebrewでnode.jsのバージョン管理を行う爆速あんちょこ

はじめに

あたらしいmac環境を手に入れたので
nodebrewでnode.jsを管理する環境を作ります。

復習もかねての自分用あんちょこメモです

アジェンダ

  1. nodebrewとは
  2. node.jsの削除
  3. nodebrewのインストール
  4. nodebrewのsetup
  5. node.jsのインストール
  6. node.jsの切り替え

1. nodebrewとは

Node.js version manager.

https://github.com/hokaccha/nodebrew

公式サイトに書かれている説明です。

Node.jsを自分のマシン内でバージョン管理するためのToolです。

2. node.jsの削除

なにで入れたかによって違いますが、
nodebrewでのnode.js管理をする場合はそれ以外で入れたものは削除しておきます。

以下はhomebrewで入れた場合の削除例です

$ brew uninstall node

3. nodebrewのインストール

$ brew install nodebrew

4. nodebrewのsetup

nodebrew setupと打つだけです。

# setupを行う
# $HOME/.nodebrewが作られる
$ nodebrew setup
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

# 確認
$ ls -ld .node*
drwxr-xr-x  9 tweeeety  tweeeety  288  6  6 21:32 .nodebrew

setupが終わると出力されるとおり、PATHの追加を忘れずに。

$ echo "export PATH=$HOME/.nodebrew/current/bin:$PATH" >> ~/.bashrc

5. node.jsのインストール

インストール可能versionの確認

インストール可能versionはnodebrew ls-remoteで確認できます

$ nodebrew ls-remote
v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6

v0.1.0    v0.1.1    v0.1.2    v0.1.3    v0.1.4    v0.1.5    v0.1.6    v0.1.7
v0.1.8    v0.1.9    v0.1.10   v0.1.11   v0.1.12   v0.1.13   v0.1.14   v0.1.15

~ 省略

io@v2.0.0 io@v2.0.1 io@v2.0.2 io@v2.1.0 io@v2.2.0 io@v2.2.1 io@v2.3.0 io@v2.3.1
io@v2.3.2 io@v2.3.3 io@v2.3.4 io@v2.4.0 io@v2.5.0

io@v3.0.0 io@v3.1.0 io@v3.2.0 io@v3.3.0 io@v3.3.1

node.jsのインストール

主に以下のコマンドでインストールします

  • nodebrew install [version]
    • 任意のversionをインストール
  • nodebrew install-binary stable
    • 安定版をインストール
  • nodebrew install-binary latest
    • 最新版をインストール
# 任意のバージョンをインストール
$ $ nodebrew install v5.12.0
Fetching: https://nodejs.org/dist/v5.12.0/node-v5.12.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully

# 安定版をインストール
$ nodebrew install-binary stable
Fetching: https://nodejs.org/dist/v10.3.0/node-v10.3.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully

6. node.jsの切り替え

nodebrew user [version]で指定して切り替えます。

# 利用可能バージョン確認
# currentが指定ないのでどれも選択していない
$ nodebrew list
v5.12.0
v10.3.0

current: none

# この状態ではnodeコマンドもない
$ node -v
-bash: node: command not found

# バージョンを指定
$ nodebrew use v5.12.0

# 指定したバージョンで利用可能になる
$ node -v
v5.12.0

$ npm -v
3.8.6

# listでも確認
$ nodebrew list
v5.12.0
v10.3.0

current: v5.12.0

おわり

さくっできて簡単\(^o^)/

【ruby】macでrbenv x bundlerでgemを管理するまでの爆速あんちょこ

はじめに

あたらしいmac環境を手に入れたので
rbenv x bundlerでgemを管理する環境を作ります。

復習もかねての自分用あんちょこメモです

あじぇんだ

  1. rbenvインストール
  2. rbenvでのrubyインストールと切り替え
  3. bundlerインストール
  4. gemのインストール

前提というほどではないですが、homebrewなどは使える状態を想定してます。

1. rbenvインストール

$ brew install rbenv

$ rbenv -v
rbenv 1.1.1

PATHの追加

~/.bashrcあたりに以下を追加します

export PATH="$HOME/.rbenv/shims:$PATH"

if type rbenv >/dev/null 2>&1; then
  # ${HOME}/.rbenvが作られる
  eval "$(rbenv init -)"and to continue
fi

2. rbenvでのrubyインストールと切り替え

任意のversionをインストール

# 初期状態
$ rbenv versions
* system (set by /usr/local/var/rbenv/version)

# インストール可能versionの表示
$ rbenv install --list
Available versions:
  1.8.5-p52
  1.8.5-p113
  1.8.5-p114
  1.8.5-p115
  1.8.5-p231

~ 省略 ~

  rbx-3.99
  rbx-3.100
  ree-1.8.7-2011.03
  ree-1.8.7-2011.12
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02
  topaz-dev

# リストの中から任意のversionをインストール
$ rben install 2.4.4

# いくつかインストールしてから確認
$  rbenv versions
* system (set by /Users/tweeeety/hoge/.ruby-version)
  2.4.0
  2.4.2
  2.4.4

versionの切り替え

切り替えには主に以下の方法を使う

  • rbenv global [バージョン]
    • ~/.rbenv/version に書き込まれる
  • rbenv local [バージョン]
    • ~/[rbenb localしたディレクトリ]/.ruby-version

実際にやるとこんなん

# rubyのversion確認
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

# このときのrbenv versions
$ rbenv versions
* system (set by /Users/tweeeety/hoge/.ruby-version)
  2.4.0
  2.4.2
  2.4.4

# 切り替え
$ rbenv local 2.4.4

# rubyのversion確認
$ ruby -v
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-darwin17]

# このときのrbenv versions
$ rbenv versions
  system
  2.4.0
  2.4.2
* 2.4.4 (set by /Users/tweeeety/hoge/.ruby-version)

3. bundlerインストール

bundler自体もgemです。
bundlerだけはグローバルにインストールします。

インストール

$ gem install bundler

$ which bundle
/Users/tweeeety/.rbenv/shims/bundle

設定

# 
$ bundler init

# Gemfileができる
$ ls
Gemfile

# 中身はこんなん
$ cat Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"

4. gemのインストール

Gemfileに記載されたgemをインストール

$ bundle install --path vendor/bundle

おわり

特にはまることもないのでさくっといけます\(^o^)/

【git】gitコマンドで毎回"Enter passphrase for key ~"と聞かれる - ssh-add

はじめに

久しぶりに新PCに環境を作っていると
git cloneで毎回パスワードを聞かれるようになりました。

$ git clone git@github.com:tweeeety/hoge.git
Cloning into 'hoge'...
Enter passphrase for key '/Users/tweeeety/.ssh/id_rsa_github':

初歩的な事だけど何度か忘れてるのでそんな自分のためにメモ

前提

前提として他の設定はうまくいってます

  • githubsshのkey設定などは済んでる
  • ~/.ssh配下のpermissionなども正しい

解決

# git cloneで毎回パスワード聞かれる
$ git clone git@github.com:tweeeety/hoge.git
Cloning into 'hoge'...
Enter passphrase for key '/Users/tweeeety/.ssh/id_rsa_github':

# ssh-addする
$ ssh-add ~/.ssh/id_rsa_github
Enter passphrase for /Users/tweeeety/.ssh/id_rsa_github_my:
Identity added: /Users/tweeeety/.ssh/id_rsa_github_my (/Users/tweeeety/.ssh/id_rsa_github_my)

# 再度git cloneする
$ git clone git@github.com:tweeeety/hoge.git
loning into 'hoge'...
remote: Counting objects: 17, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 17 (delta 2), reused 17 (delta 2), pack-reused 0
Receiving objects: 100% (17/17), done.
Resolving deltas: 100% (2/2), done.

おわり

すごく初歩的だけどたまに環境構築しなおしたりするとハマりますね

【gulp】run-sequenceでtaskを並列/直列(同期的)にする挙動を確認する

はじめに

gulpは長い事つかってますが、 フロントの方が入れてくれた環境を基に使っているのでゼロから学んだ経験は乏しいです。 (自分はサーバサイド)

ディレクトリのclearやbuildを行うためにrun-sequenceを使っています。

ふとした動機でこれの挙動をちゃんと確認したくなったので
そんなときの自分メモ

f:id:tweeeety:20180531172527p:plain

アジェンダ

  1. run-sequenceとは
  2. run-sequenceの使い方
  3. run-sequenceのrunSequenceで直列指定の挙動を確認

1. run-sequenceとは

説明は公式からの引用です

Runs a sequence of gulp tasks in the specified order.
This function is designed to solve the situation where you have defined run-order,
but choose not to or cannot use dependencies.
 
https://www.npmjs.com/package/run-sequence

指定された順序で一連のタスクを実行する君ということですね。

gulp4.0

公式サイトからの引用です。

これは、同様にタスクの依存関係を定義するためのサポートを持つ必要がある、
gulp 4.0のリリースまでの一時的な解決策であることを意図していました。
 
https://www.npmjs.com/package/run-sequence

公式サイトPlease Noteに記載がありますが、
gulp4.0ではgulp.seriesgulp.parallelという機能で同様の事ができるらしいです。

ちなみに、gulp4.0のchangelogには記載があります。

2. run-sequenceの使い方

インストール

$ npm install --save-dev run-sequence

使い方

公式からの引用です。
https://www.npmjs.com/package/run-sequence#usage

var gulp = require('gulp');
var runSequence = require('run-sequence');
var del = require('del');
var fs = require('fs');
 
// This will run in this order:
// * build-clean
// * build-scripts and build-styles in parallel
// * build-html
// * Finally call the callback function
gulp.task('build', function(callback) {
  runSequence('build-clean',
              ['build-scripts', 'build-styles'],
              'build-html',
              callback);
});
 
// configure build-clean, build-scripts, build-styles, build-html as you wish,
// but make sure they either return a stream or promise, or handle the callback
// Example:
 
gulp.task('build-clean', function() {
    // Return the Promise from del()
    return del([BUILD_DIRECTORY]);
//  ^^^^^^
//   This is the key here, to make sure asynchronous tasks are done!
});
 
gulp.task('build-scripts', function() {
    // Return the stream from gulp
    return gulp.src(SCRIPTS_SRC).pipe(...)...
//  ^^^^^^
//   This is the key here, to make sure tasks run to completion!
});
 
gulp.task('callback-example', function(callback) {
    // Use the callback in the async function
    fs.readFile('...', function(err, file) {
        console.log(file);
        callback();
//      ^^^^^^^^^^
//       This is what lets gulp know this task is complete!
    });
});

ポイント

上記のコードでいうと、ポイントは以下です。

  runSequence('build-clean',
              ['build-scripts', 'build-styles'],
              'build-html',
              callback);
  • runSequenceに記載した順に直列で実行される
  • 各タスクはreturnするか、callback()を呼び出す必要がある

3. run-sequenceのrunSequenceで直列指定の挙動を確認

まず、非同期な処理想定としてsetTimeoutを使って確認してみます。

runSequenceを使うパターンを以下のようなパターンで確認します。

  • 3.0. runSequence使った場合の期待する挙動
  • 3.1. runSequence使わなかった場合
  • 3.2. runSequencee使ったがcallback呼ばなかった場合
  • 3.3. runSequencee使ってcallbackを入れたがおしい場合
  • 3.4. runSequencee使って意図通りの指定をした場合

3.0. runSequencee使った場合の期待する挙動

まずは期待する挙動です。
以下のようにtaskを定義したとします。

f:id:tweeeety:20180531164424p:plain

この時、呼ばれる順番を以下のように期待したという前提ですすめます。
f:id:tweeeety:20180531164445p:plain

3.1. runSequence使わなかった場合

runSequenceを使わなかった場合の挙動を確認します。

コード
var gulp = require('gulp');                                                                                                                                                                                                                                

gulp.task('task', ['task-1', 'task-2', 'task-3']);

gulp.task('task-1', function() {
  console.log('called task-1');
});

gulp.task('task-2', ['task-2-1', 'task-2-2']);

gulp.task('task-2-1', function() {
  console.log('called task-2-1');

  // 5秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-2-1_subtask");
  }, 5000);
});

gulp.task('task-2-2', function() {
  console.log('called task-2-2');

  // 3秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-2-2_subtask");
  }, 3000);
});

gulp.task('task-3', function() {
  console.log('called task-3');

  // 1秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-3_subtask");
  }, 1000);

});

gulp.task('default', ['task-normal']);

このコードは以下に置きました。
https://github.com/tweeeety/gulp-task-order/blob/master/task_normal/gulpfile.js

実行してみる

このまま実行すると、*_subtaskが非同期に最後にまとめて呼ばれます。

$ gulp task
[16:39:10] Using gulpfile ~/gulp-task-order/task_normal/gulpfile.js
[16:39:10] Starting 'task-1'...
called task-1
[16:39:10] Finished 'task-1' after 104 μs
[16:39:10] Starting 'task-2-1'...
called task-2-1
[16:39:10] Finished 'task-2-1' after 592 μs
[16:39:10] Starting 'task-2-2'...
called task-2-2
[16:39:10] Finished 'task-2-2' after 558 μs
[16:39:10] Starting 'task-2'...
[16:39:10] Finished 'task-2' after 2 μs
[16:39:10] Starting 'task-3'...
called task-3
[16:39:10] Finished 'task-3' after 38 μs
[16:39:10] Starting 'task'...
[16:39:10] Finished 'task' after 1.78 μs
  called task-3_subtask
  called task-2-2_subtask
  called task-2-1_subtask
結果

以下のような順で呼ばれています

f:id:tweeeety:20180531164537p:plain

ポイント
  • *_subtaskたちが非同期にすべて最後に呼ばれている
  • 順番もtask-3-1_subtask, task-2-2_subtask, task-2-1_subtaskというように期待した逆の順に呼ばれている

3.2. runSequence使ったがcallback呼ばなかった場合

runSequenceは使ったが、callbackを呼ばなかった場合の挙動を確認します。
一番よくありがちなパターンでしょうか。

コード
var gulp = require('gulp');
var runSequence = require('run-sequence');

gulp.task('task', function(callback) {
  runSequence('task-1', 'task-2', 'task-3', callback);
});
                                                                                                                                                                                                                                                           
gulp.task('task-1', function() {
  console.log('called task-1');
});

gulp.task('task-2', ['task-2-1', 'task-2-2']);

gulp.task('task-2-1', function() {
  console.log('called task-2-1');

  // 5秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-2-1_subtask");
  }, 5000);
});

gulp.task('task-2-2', function() {
  console.log('called task-2-2');

  // 3秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-2-2_subtask");
  }, 3000);
});

gulp.task('task-3', function() {
  console.log('called task-3');

  // 1秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-3_subtask");
  }, 1000);

});

gulp.task('default', ['task-sync-fail-1']);

このコードは以下に置きました。
https://github.com/tweeeety/gulp-task-order/blob/master/task_sync_fail_1/gulpfile.js

実行してみる

runSequenceを使ったものの、
3.1. runSequence使わなかった場合 とまったく同じ結果で非同期なままです。

$ gulp task
[17:02:17] Using gulpfile ~/gulp-task-order/task_sync_fail_1/gulpfile.js
[17:02:17] Starting 'task'...
[17:02:17] Starting 'task-1'...
called task-1
[17:02:17] Finished 'task-1' after 102 μs
[17:02:17] Starting 'task-2-1'...
called task-2-1
[17:02:17] Finished 'task-2-1' after 967 μs
[17:02:17] Starting 'task-2-2'...
called task-2-2
[17:02:17] Finished 'task-2-2' after 901 μs
[17:02:17] Starting 'task-2'...
[17:02:17] Finished 'task-2' after 2.05 μs
[17:02:17] Starting 'task-3'...
called task-3
[17:02:17] Finished 'task-3' after 40 μs
[17:02:17] Finished 'task' after 5.69 ms
  called task-3_subtask
  called task-2-2_subtask
  called task-2-1_subtask
結果

以下のような順で呼ばれています

f:id:tweeeety:20180531170801p:plain

ポイント
  • 3.1. runSequence使わなかった場合 とまったく同じ

3.3. runSequencee使ってcallbackを入れたがおしい場合

runSequenceeを使ってcallbackも入れたがネストが考慮されてない場合の挙動を確認してみます。

コード
var gulp = require('gulp');
var runSequence = require('run-sequence');

gulp.task('task', function(callback) {                                                                                                                                                                                                                     
  runSequence('task-1', 'task-2', 'task-3', callback);
});

gulp.task('task-1', function() {
  console.log('called task-1');
});

gulp.task('task-2', ['task-2-1', 'task-2-2']);

gulp.task('task-2-1', function(callback) {
  console.log('called task-2-1');

  // 5秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-2-1_subtask");
    callback();
  }, 5000);
});

gulp.task('task-2-2', function(callback) {
  console.log('called task-2-2');

  // 3秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-2-2_subtask");
    callback();
  }, 3000);
});

gulp.task('task-3', function(callback) {
  console.log('called task-3');

  // 1秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-3_subtask");
    callback();
  }, 1000);

});

gulp.task('default', ['task-sync-fail-2']);

このコードは以下に置きました。
https://github.com/tweeeety/gulp-task-order/blob/master/task_sync_fail_2/gulpfile.js

実行してみる

よく見ないとわかりずらいですが、
task-2-2_subtasktask-2-1_subtaksあたりが意図した通りになっていません。

$ gulp task
[17:13:16] Using gulpfile ~/gulp-task-order/task_sync_fail_2/gulpfile.js
[17:13:16] Starting 'task'...
[17:13:16] Starting 'task-1'...
called task-1
[17:13:16] Finished 'task-1' after 163 μs
[17:13:16] Starting 'task-2-1'...
called task-2-1
[17:13:16] Starting 'task-2-2'...
called task-2-2
  called task-2-2_subtask
[17:13:19] Finished 'task-2-2' after 3 s
  called task-2-1_subtask
[17:13:21] Finished 'task-2-1' after 5 s
[17:13:21] Starting 'task-2'...
[17:13:21] Finished 'task-2' after 4.19 μs
[17:13:21] Starting 'task-3'...
called task-3
  called task-3_subtask
[17:13:22] Finished 'task-3' after 1 s
[17:13:22] Finished 'task' after 6.01 s
結果

以下のような順で呼ばれています
f:id:tweeeety:20180531172026p:plain

ポイント
  • task2とtask3の*_subtaskは、それぞれの中で呼ばれるようになった
  • ただし、task2内のtask-2-2_subtask、task-2-1_subtaksの順番は非同期のまま

3.4. runSequencee使って意図通りの指定をした場合

最後に意図通りの使い方の確認です。

コード
var gulp = require('gulp');
var runSequence = require('run-sequence');

gulp.task('task', function(callback) {
  runSequence('task-1', 'task-2', 'task-3', callback);
});

gulp.task('task-1', function() {
  console.log('called task-1');
});

gulp.task('task-2', function(callback){                                                                                                                                                                                                                    
  runSequence('task-2-1', 'task-2-2', callback);
});

gulp.task('task-2-1', function(callback) {
  console.log('called task-2-1');

  // 5秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-2-1_subtask");
    callback();
  }, 5000);
});

gulp.task('task-2-2', function(callback) {
  console.log('called task-2-2');

  // 3秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-2-2_subtask");
    callback();
  }, 3000);
});

gulp.task('task-3', function(callback) {
  console.log('called task-3');

  // 1秒間かかるタスク
  setTimeout(function(){
    console.log("\tcalled task-3_subtask");
    callback();
  }, 1000);

});

gulp.task('default', ['task-sync']);

このコードは以下に置きました。
https://github.com/tweeeety/gulp-task-order/blob/master/task_sync/gulpfile.js

実行してみる

意図どおりになりました!

$ gulp task
[17:21:37] Using gulpfile ~/gulp-task-order/task_sync/gulpfile.js
[17:21:37] Starting 'task'...
[17:21:37] Starting 'task-1'...
called task-1
[17:21:37] Finished 'task-1' after 102 μs
[17:21:37] Starting 'task-2'...
[17:21:37] Starting 'task-2-1'...
called task-2-1
  called task-2-1_subtask
[17:21:42] Finished 'task-2-1' after 5 s
[17:21:42] Starting 'task-2-2'...
called task-2-2
  called task-2-2_subtask
[17:21:45] Finished 'task-2-2' after 3 s
[17:21:45] Finished 'task-2' after 8.01 s
[17:21:45] Starting 'task-3'...
called task-3
  called task-3_subtask
[17:21:46] Finished 'task-3' after 1 s
[17:21:46] Finished 'task' after 9.01 s
結果

無事意図通りに呼ばれるようになりました。 f:id:tweeeety:20180531172423p:plain

サンプル

一応サンプルをおいておきました。
npm installすればそれぞれ試せます。

参考

おわり

使い方や説明を見てわかることもありますが、
実際に確認するのって大切ですよね\(^o^)/