tweeeetyのぶろぐ的めも

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

【make】makefileで`*** missing separator. Stop.`と怒られる

はじめに

すごく初歩的ですが...
make時に以下【make】makefile*** missing separator. Stop.と怒られる

はじめに

すごく初歩的ですが...
make時に以下のようなエラーが出ることがあって小一時間悩んだので自分用いましメモ

$ make
makefile:4: *** missing separator.  Stop.

なぜエラーか

makefileは以下のように記載しますが、

target: file
  command...

commandの前は
スペースではなく、かならずタブ で書く必要があります。

これをスペースで書いてしまったときにタイトルのようなエラーが出ます。

サンプル

  • makefile
    • hoge:の次の行の先頭はタブ
    • fuga:の次の行の先頭がスペース
$ cat makefile
hoge:
    @echo "say hoge"
fuga:
    echo "say fuga"
  • 実行
$ make
makefile:4: *** missing separator.  Stop.

捕捉

vimなどでちゃんとcolor schemeが効いて入ればすぐ気づけます

参考

おわり

これだけの行数サンプルだと即気づくんですが、
結構長いmakefileでcolor scheme無しで書いてたので 一部だけスペースなことに全然気づきませんでした... のようなエラーが出ることがあって小一時間悩んだので自分用いましメモ

$ make
makefile:4: *** missing separator.  Stop.

なぜエラーか

makefileは以下のように記載しますが、

target: file
  command...

commandの前は
スペースではなく、かならずタブ で書く必要があります。

サンプル

  • makefile
    • hoge:の次の行の先頭はタブ
    • fuga:の次の行の先頭がスペース
$ cat makefile
hoge:
    @echo "say hoge"
fuga:
    echo "say fuga"
  • 実行
$ make
makefile:4: *** missing separator.  Stop.

捕捉

vimなどでちゃんとcolor schemeが効いて入ればすぐ気づけます

f:id:tweeeety:20180608211325p:plain

参考

おわり

結構長いmakefileでcolor scheme無しで書いてたので
一部だけスペースなことに全然気づきませんでした...つらみ...\(^o^)/

【node.js】npmで`TypeError: require.extensions.hasOwnProperty is not a function`というエラーで怒られる

はじめに

f:id:tweeeety:20180608202233p:plain

タイトルのまんまですが、 とあるプロジェクトでnpm runスクリプトを走らせると以下のようなエラーが出たのでその対処方メモ

# nodeのversionをあげる
$ nodebrew install v8.11.0
$ nodebrew use v8.11.0

# 念のため削除
$ rm -rf node_modules
$ rm -rf ~/.npm

# いれなおす
$ npm install

# versionをあげる前は動いていたが
# npmスクリプトでエラー
$ npm run sample

> hoge@1.0.0 sample /Users/tweeeety/hoge
> gulp

/Users/tweeeety/hoge/node_modules/require-dir/index.js:97
            if (!require.extensions.hasOwnProperty(ext)) {
                                    ^

TypeError: require.extensions.hasOwnProperty is not a function
    at requireDir (/Users/tweeeety/hoge/node_modules/require-dir/index.js:97:37)
    at Object.<anonymous> (/Users/tweeeety/hoge/gulpfile.js:2:1)
    at Module._compile (module.js:612:30)
    at Object.Module._extensions..js (module.js:623:10)
    at Module.load (module.js:531:32)
    at tryModuleLoad (module.js:494:12)
    at Function.Module._load (module.js:486:3)
    at Module.require (module.js:556:17)
    at require (internal/module.js:11:18)
    at Liftoff.handleArguments (/Users/tweeeety/hoge/node_modules/gulp/bin/gulp.js:116:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! hoge@1.0.0 compile: `gulp`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the hoge@1.0.0 compile script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/tweeeety/.npm/_logs/2018-06-08T04_01_16_000Z-debug.log

このときの環境

$ ruby -v
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-darwin17]

$ node -v
v8.11.0

$ npm -v
3.8.6

$ rbenv -v
rbenv 1.1.1

$ nodebrew list
v5.12.0
v8.11.0

current: v8.11.0

なにがおこったか

根本原因

githubのissueにあがってました

https://github.com/tjunnone/npm-check-updates/issues/363

nodeのmoduleのrequire-dirを古いまま使い続けているからぽいです。

自分のところの原因

nodeを8.x.xなどの新しいものにあげましたが、
package.jsonでバージョンを固定したモジュールが古いままだったためでした。

  • nodeを8.x.xにあげた
  • 固定していたmodule(今回でいうrequire-dir)のversionが古いままで8.x.xに対応していないversionのままだった

というかんじ

確認する

まずは今のrequire-dirのversionを確認してみました。
https://github.com/aseemk/requireDir/releases

たしかに0.3.2 -> 1.0.0とあがってます。

f:id:tweeeety:20180608202312p:plain

次に、このプロジェクトで使っているsouce-mapを確認してみます。

# 0.3.0でした
# それが悪いってことでもないけど...
$ npm list require-dir
hoge@1.0.0 /Users/tweeeety/hoge
└── require-dir@0.3.0

対応

では、どうやってバージョンをあげたかというと
今回はncu(npm-check-updates)require-dir以外も一括更新しました。

ncuに関しては以下をご参照ください。

doing!

# nodeのversionをあげる
$ nodebrew install v8.11.0
$ nodebrew use v8.11.0

# 念のため削除
$ rm -rf node_modules
$ rm -rf ~/.npm

# 入ってなければいれる
$ npm uninstall npm-check-updates -g && npm install npm-check-updates -g

# 更新実行
$ ncu
$ ncu -u

# いれなおす
$ npm install

# エラーなくなった!
$ npm run sample

参考

以下のサイトも参考にさせていただきました!thx!

おわり

すぐわかればイイですがこういう系ってハマると長いですよね\(^o^)/

【node.js】ncu(npm-check-updates)でpackage.jsonのmodulesバージョンを一括で更新

はじめに

npm-check-updates、いまさら感はありますが
使ってあらためて便利だったのでこの機会にメモ

f:id:tweeeety:20180608193224p:plain

ncu(npm-check-updates)とは

公式URL

上記の公式からの引用です

npm-check-updates allows you to upgrade your package.json dependencies to the latest versions, regardless of existing version constraints.

package.jsonの依存関係を最新のバージョンにアップグレードしてくれるmoduleですね。

インストール

グローバルにインストールして使います

$ npm install -g npm-check-updates

使い方

dry-run

ncuと打つと実際には更新せずに、
更新対象のリストが表示されます。

$ ncu
 $ ncu
Using /Users/tweeeety/hoge/package.json
⸨░░░░░░░░░░░░░░░░░░⸩ ⠴ :
 browserify      13.0.1  →  16.2.2
 del              2.2.1  →   3.0.0
 diff-json        0.1.1  →  0.1.11
 es6-promise      4.0.5  →   4.2.4
 gulp-cheerio     0.6.2  →   0.6.3
 gulp-concat      2.6.0  →   2.6.1
 gulp-cssmin      0.1.7  →   0.2.0
 gulp-frontnote   1.0.3  →   2.0.1
 gulp-plumber     1.1.0  →   1.2.0
 gulp-rename      1.2.2  →   1.2.3
 gulp-replace     0.5.4  →   1.0.0
 gulp-svgmin      1.2.2  →   1.2.4
 gulp-svgstore    6.0.0  →   6.1.1
 gulp-uglify      1.5.4  →   3.0.0
 moment          2.14.1  →  2.22.2
 remodal          1.1.0  →   1.1.1
 require-dir      0.3.0  →   1.0.0
 run-sequence     1.2.2  →   2.2.1
 stripify         4.0.0  →   6.0.0
 svg4everybody    2.1.4  →   2.1.9
 through2         2.0.1  →   2.0.3
 underscore       1.8.3  →   1.9.1

Run ncu with -u to upgrade package.json

更新

ncu -uとすることで
実際に更新が走り、合わせてpackage.jsonも書き換えてくれます。

$ ncu -u

あとは公式に詳しく書いてあるので以上、、、ということで、、、w
https://github.com/tjunnone/npm-check-updates#options

おわり

全体的にサクっとupdateできるので便利です
\(^o^)/

【node.js】npmで`SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode` というエラーで怒られる

はじめに

f:id:tweeeety:20180608202233p:plain

タイトルのまんまですが、
とあるプロジェクトでnpm runスクリプトを走らせると以下のようなエラーが出たのでその対処方メモ

$ npm run sample

> hoge@1.0.0 sample /Users/tweeeety/hoge
> gulp

/Users/tweeeety/hoge/node_modules/riot-compiler/node_modules/source-map/lib/source-map-generator.js:21
class SourceMapGenerator {
^^^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:387:25)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Module.require (module.js:367:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/Users/tweeeety/hoge/node_modules/riot-compiler/node_modules/source-map/source-map.js:6:30)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)

npm ERR! Darwin 17.5.0
npm ERR! argv "/Users/tweeeety/.nodebrew/node/v5.12.0/bin/node" "/Users/tweeeety/.nodebrew/current/bin/npm" "run" "compile"
npm ERR! node v5.12.0
npm ERR! npm  v3.8.6
npm ERR! code ELIFECYCLE
npm ERR! hoge@1.0.0 compile: `gulp`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the hoge@1.0.0 compile script 'gulp'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the hoge package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     gulp
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs hoge
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls hoge
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/tweeeety/hoge/npm-debug.log

このときの環境

$ ruby -v
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-darwin17]

$ node -v
v5.12.0

$ npm -v
3.8.6

$ rbenv -v
rbenv 1.1.1

$ nodebrew list
v5.12.0

current: v5.12.0

なにがおこったか

根本原因

githubのissueにあがってました

Version 0.7.0 of source-map fails to load on Node < 6 due to let without 'use strict'. This causes the following error:

node moduleのsource-map 0.7.0は
'use strict'を使用しないのでnodeのversion<6(6未満)にはロードできないらしい。
そのせいでエラーが発生するとのこと。

自分のところの原因

nodeが5.x.xでも、package.jsonでバージョンをがちがちに固定していれば大丈夫だと思います。

  • nodeが5.x.x
  • 固定していないmodule(今回でいうsource-map)のversionがあがって5.x.xでは動かなくなった

というかんじ

確認する

このプロジェクトで使っているsouce-mapを確認してみます。

# たしかに0.7.3がいる
$ npm list source-map
hoge@1.0.0 /Users/tweeeety/hoge
├─┬ gulp-concat@2.6.1
│ └─┬ concat-with-sourcemaps@1.1.0
│   └── source-map@0.6.1
├─┬ gulp-cssmin@0.2.0
│ └─┬ clean-css@3.4.28
│   └── source-map@0.4.4
├─┬ gulp-uglify@3.0.0
│ ├─┬ uglify-js@3.4.0
│ │ └── source-map@0.6.1
│ └─┬ vinyl-sourcemaps-apply@0.2.1
│   └── source-map@0.5.7
└─┬ riot@3.10.1
  └─┬ riot-compiler@3.5.1
    └── source-map@0.7.3

対応

記載の通りですが、
6以上にあげるとエラーはでなくなりました。

# インストールできるversionを確認
$ nodebrew ls-remote

# とりあえず少しだけあげて6.x.xにする
$ nodebrew install v6.14.2
$ nodebrew use v6.14.2
use v6.14.2

# エラーでない
$ npm run sample

ちなみに

5.x.xもものすっごく昔というわけではないですが、
nodeの5.x.xはサポートは終了しているようです。

特に理由がなさそうならあげちゃったほうがよさそうです。

おわり

5系は古い \(^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^)/