Open8

yarnとnpmについてのナレッジ

CODE-EGGCODE-EGG

yarn

node.jsのパッケージマネージャー。
FaceBook製。
npmより後発。
npmと互換性がある。(package.jsonが使える)

初期化

ターミナル
yarn init

対話形式でpackage.jsonを作成する。プロジェクトがyarnで管理される。(package.jsonが作られる)
次のように入力すればすべてEnterされる。あとからpackage.jsonを編集すればよいので以下が楽。

ターミナル
yarn init -y

パッケージを追加

ターミナル
yarn add {パッケージ名}

dependenciesに追加される。

devDependenciesにパッケージを追加

ターミナル
yarn add --dev {パッケージ名}
yarn add -D {パッケージ名}

開発時にしか利用しないパッケージは-Dでインストールしておくとよい。
例えばeslintはコードをチェックするパッケージで、webに公開したら利用されることがないのでdevDependenciesに追加する。

グローバルにパッケージを追加する

ターミナル
yarn global add {パッケージ名}

ちなみに次のようにするとローカルとグローバル両方にインストールされるので注意。

ターミナル
yarn add global {パッケージ名}

yarn globalの確認方法

プロジェクト単位ではなくyarn globalにインストールされたパッケージはすべてのプロジェクトで利用できる。

確認は以下のコマンド。

ターミナル
yarn global list

yarn install

package.jsonのdependenciesとdevDependenciesに書かれているパッケージをインストールする。
https://chore-update--yarnpkg.netlify.app/ja/docs/cli/#toc-default-command
単にyarn でもOK。
※npmにもinstallがあるが、addとinstallを合わせてinstallとなっているので注意。

yarn run

ローカルにあるパッケージのコマンドを実行するためのyarnのコマンド。

例えば、eslintを実行するためのコマンドとしてeslintというコマンドがあるが、このコマンドは使うとエラーになる。(ただしyarn global add をしていたらエラーにはならない。)

ターミナル
eslint index.ts

コマンドの実行の仕組みとしては次の通り。

  1. ターミナルにコマンドを入力。
  2. OSが環境変数に定義されているpathを確認する。
  3. なければグローバルインストールを確認する。
  4. なければエラーを出力する

グローバルインストールの場所

ターミナル
yarn global bin

yarnのグローバルにないのにグローバル実行できる場合は、npmでグローバルインストールされている可能性がある。

ターミナル
npm root -g
C:\Users\{ユーザ名}\AppData\Roaming\npm\node_modules


フォルダの中を見るとbinがあるのでこれを実行してくれる。

yarnのようなパッケージマネージャでパッケージをローカルにインストールして管理していく。
yarnが管理者なのでローカルのパッケージを動かすにはyarnを通して実行してもらう必要がある。

ただし、直接binまでのパスを指定して叩くことはできそう。例えば次ようにする。

ターミナル
./node_modules/eslint/bin/eslint.js {ファイル名}

binとは?

パッケージの実行ファイル(コマンド)をインストールするフォルダ。./node_modules/binにある。
yarn add でパッケージをインストールすると、yarn runで実行できるようにされた各パッケージの実行ファイルが作成される。

yarnのbinフォルダの場所の確認方法

yarn が管理しているbinフォルダの場所を表示する。

ターミナル
yarn bin

実行ファイルとは?

プログラムが書かれたファイル。コマンドを入力したときに初めに動くファイル?
(.exeのような拡張子であることが多い。)

yarnによってbinフォルダが作られ、binの中でインストールしたパッケージの実行ファイルを管理している。これはnpmの場合は、npmによってbinが作られてbinの中で実行ファイルが管理される。
このようにパッケージマネージャー毎にbinが作られるので複数のパッケージマネージャーを利用するのはバグの元なので禁止。

パッケージの追加

ターミナル
yarn add {パッケージ名}

dependenciesに追加される。

devDependenciesにパッケージ追加する

ターミナル
yarn add --dev {パッケージ名}
yarn add -D {パッケージ名}

これらは開発時にしか利用しないパッケージは-Dでインストールしておくとよい。
例えばeslintはコードの構文チェックに利用する。webに公開したらeslintは利用されることがないのでdevDependenciesに追加する。

yarn install

package.jsonのdependenciesとdevDependenciesに書かれているパッケージをインストールする。
https://chore-update--yarnpkg.netlify.app/ja/docs/cli/#toc-default-command
単にyarn でもOK。

グローバルにパッケージを追加する

ターミナル
yarn global add {パッケージ名}

ちなみに次のようにするとローカルとグローバル両方にインストールされる。

ターミナル
yarn add global {パッケージ名}

なぜyarn add でローカルにmoduleをインストールするのか。

package.jsonに記録されるので、チーム間でバージョンをそろえるのが容易になるため。
バージョンが勝手に変わると面倒。

yarn globalの確認方法

プロジェクト単位ではなくyarn globalにインストールされたパッケージはすべてのプロジェクトで利用できる。

確認は以下のコマンド。

ターミナル
yarn global list

yarn run とは?

ローカルのパッケージのコマンドを実行するためのyarnのコマンド。(このような使い方をタスクランナーという)
基本的にyarnのようなパッケージマネージャでパッケージをローカルにインストールして管理していく。
yarnが管理者なのでローカルのパッケージを動かすにはyarnを通して実行してもらう必要がある。

ただし、直接binまでのパスを指定して叩くことはできそう。例えば次ようにする。

ターミナル
./node_modules/eslint/bin/eslint.js {ファイル名}

(グローバルインストールすればパスが通り、eslintだけで実行できるようになる)

binとは?

パッケージの実行ファイルをインストールするフォルダ。./node_modules/binにある。
yarn add でパッケージをインストールすると、yarn runで実行できるようにされた各パッケージの実行ファイルが作成される。

なぜコマンドをyarn runで実行する必要があるのか?

パッケージのコマンドは基本的にnode_modules/*/binの中に入っている。
例えばeslintコマンドを実行するには次のように入力する必要がある。(グローバルインストールするとyarnではなくコンピューターによってパッケージが管理される。つまりパスが通るので、グローバルインストールの場合は単に「eslint」と入力しても実行できる。)

ターミナル
./node_modules/eslint/bin/eslint.js {ファイル名}

これでは長くて面倒。
package.jsonのscriptにコマンドを書くことで
yarn run {任意のコマンド名}で簡単に実行できるようになる。

package.json
{
    "scripts": {
        "lint": "eslint --dir {対象のフォルダ}"
    },
}
ターミナル
yarn run lint

※ここでeslintで良いのはなぜかというと、package.jsonにeslintと書くと、node_modulesからeslintを探して実行してくれるから。

yarn run

yarn runだけだと、現在yarn runで実行できるコマンドの一覧を表示してくれる。

yarn runの省略

scriptのコマンドを実行する場合は、runを省略できる。

ターミナル
yarn lint

参照リンク

https://qiita.com/Mount/items/5f8196b891444575b7db
https://qiita.com/mysticatea/items/f523dab04a25f617c87d

CODE-EGGCODE-EGG

npm

npx

ローカルにインストールされているパッケージのコマンドを実行するためのコマンド。
npxは./node_modules/.binからコマンドを探して実行する。もしなければ、ローカルにパッケージをインストールして実行する。実行した後は、アンインストールされるので環境が汚れることがないため良い。

CODE-EGGCODE-EGG

関連

実行コマンドのフルパス表示方法

ターミナル
$ which eslint
/c/Users/ユーザ名/AppData/Roaming/npm/eslint