ShellScript
Bash
Zsh
npm
YARN

@foo/barみたいな形式の大量のnpmパッケージをちょっとラクしてインストールする方法

名前空間のあるモジュールたち

最近はnpmにネームスペースがあるタイプのモジュールが増えてきていますね。

有名なのはbabelとかDefinitelyTyped(@types)など。

@babel/preset-envみたいなものや@types/~とか一度は打ったことがあると思います。

こういう接頭辞に@namescope/が付くものをnpm公式は『Scoped Packages』と呼んでいます。

他にもユーザーコミュニティでは

  • Named-Module
  • Named-Package
  • Scoped-Module
  • Namespace-module

などと呼ばれているのを見たことがあります。

ちなみに余談ですが@namescope/なモジュールは有名なライブラリグループだけが利用できるとかはなく、全ユーザ誰でも利用できます。

ちょっとめんどくさい問題

@namescope/打つのめんどくさい!

開発していると『必要なモジュールが複数あってコピペしなくてもパッケージ名はわかっているけどScoped Packagesだ…』とか『全部の接頭辞にネームスペースつけないと…』という場面がたまにあります。

たとえば

  • react-collapsible
  • react-dom
  • react-image-gallery
  • react-modal
  • react-router-dom
  • react-swipeable-views
  • react-virtualized

これらモジュールをインストールしている状況で、型定義ファイルが必要なので@typesにある型定義パッケージも必要……みたいな場面。

全部の接頭辞に@typesを付ける必要がありますね。

$ yarn add -D @types/react-collapsible @types/react-dom @types/react-image-gallery @types/react-modal @types/react-router-dom @types/react-swipeable-views @types/react-virtualized

なんだかつらい

ラクしてインストールしたい

@types何度も打ちたくないんだよね』

お気持ちわかります、こう書きましょう。

$ yarn add -D @types/{react-collapsible,react-dom,react-image-gallery,react-modal,react-router-dom,react-swipeable-views,react-virtualized}

こういう書き方ができます。

これなにやってるの

BashやZSHのようなシェルのBrace(波括弧)展開の機能を使ってカッコ内を展開しています。

なのでYarnとかnpmとか特有の機能というわけではなくて、ようはシェルの記法で短縮しているというだけです。

echoしてみましょう

$ echo @types/{react-collapsible,react-dom,react-image-gallery,react-modal,react-router-dom,react-swipeable-views,react-virtualized}

@types/react-collapsible @types/react-dom @types/react-image-gallery @types/react-modal @types/react-router-dom @types/react-swipeable-views @types/react-virtualized

単純ですね。

ちなみに

今回の例に関しては全部react-がついたパッケージだったので

$ yarn add -D @types/react-{collapsible,dom,image-gallery,modal,router-dom,swipeable-views,virtualized}

こうも書けますね。

react-も省きたい方にはいいかもしれません。

その他有用な利用場面

もしあなたがOSSパッケージ作者でREADME.mdを書くときrequireなモジュールのインストールコマンドを書くかもしれません。

yarn add @namescope/foo @namescope/bar @namescope/baz ...

みたいに書くより

yarn add @namescope/{foo,bar,baz}

と書くほうが短いのでなんだかシュッとするかもしれません(?)

ほかにも登壇スライドや勉強会資料などでインストールコマンドを書くとき長くて文字で埋まる…みたいなことが減らせるかもしれません。

これらは想定で書いているのでこれら場面でこう書いたほうがいいとかこう書くべきという扇動をしたいわけではありません。あくまで用例です。