💭

まだyarnやnpmやpnpmの打ち間違いで消耗してるの?

2023/03/09に公開

まだパッケージマネージャーの打ち間違いで消耗してるの?

初手煽りタイトル失礼します。よだかと申します。
僕はフリーランスでいくつかプロジェクトをやらせてもらっているのですが、プロジェクトごとにパッケージマネージャーが違ったりします。
これがかなり辛く、yarnのプロジェクトでnpm installしてpackage-lock.jsonを生成してしまったり、npmのプロジェクトでyarn installしてyarn.lockを生成してしまったり。。
果ては、yarn devなのか、npm run devなのか、など気をつけないいけないことがかなり多いです。

そこで今回ご紹介したいのがniというツールです。
https://github.com/antfu/ni

niについて

niについて説明するために、READMEを見てみましょう。
まずは一行目です。

npm i in a yarn project, again? F**k!

とても強い思いから生まれたツールであるということがわかりますね。
そこからREADMEを読み進めてみますと、ni - use the right package managerと書かれています。
端的に言うと、プロジェクトに使われているパッケージマネージャーを自動的に選んでコマンドを実行してくれるツールです。
以下に使用例を示します。

install系

# install
ni
# viteをinstall
ni vite
# @types/nodeをdevDependanciesにinstall
ni @types/node -D
# clean install
ni --frozen
# 同じくclean install
nci
# eslintをglobal install
ni -g eslint

# upgrade
nu
# upgrade-interactive
nu -i

# uninstall
nun webpack

run系

# いつものrunコマンド
nr dev --port=3000

# scriptをインタラクティブに決定できる
nr
? script to run ›
❯   dev - run-p dev:next dev:path
    dev:next - node ./server/server.js
    dev:path - pathpida --ignorePath .gitignore --watch
    build - pathpida --ignorePath .gitignore && next build
    start - next start
    lint - next lint
    prettier - prettier --write .
    storybook - start-storybook -p 6006
    build-storybook - build-storybook

# 直前のコマンドをrerunする
nr -

# npx,yarn dlxに該当する実行する系のやつ
nix vitest

その他

# agent-alias(yarn, npm, などパッケージ名だけのコマンド)
na

小話

ni

ここまで読んだあなたはniのiがinstallのiだったことに気づくでしょう。
nixやnuやnunなどコマンド名が可愛くて明快で好きです。(nunはnuiでも良かった気がする)
また、このパッケージの作者は実はVueやNuxtやViteのコアチームの方で、antfuさんと言います。
https://github.com/antfu

どうやって使うパッケージマネージャーを判定しているのか

ni assumes that you work with lockfiles (and you should)
Before it runs, it will detect your yarn.lock / pnpm-lock.yaml / package-lock.json / bun.lockb to know current package manager (or packageManager field in your packages.json if specified), and runs the corresponding commands.

と書いてあるので、lockファイルがあればそれを見て判断、またはpackage.jsonのpackageManagerフィールドを見て判断しているそうです。
なので、大体の場合niをローカルでグローバルインストールするだけで動きます。
注意:パスは通してくれないので、source ~/.zshrcするかターミナルを立ち上げなおす必要があります。

終わりに

niを使うことでプロジェクト間のパッケージマネージャーのコマンドの違いを吸収することができます。
これでもっと請け負えるプロジェクトが増やせますね!!
命を燃やせ!

Discussion