1
Help us understand the problem. What are the problem?

posted at

updated at

Javascript(Node.js)プロジェクトの開発者は必須! ncuコマンドでパッケージを最新化する

はじめに

Javascript(Node.js)のプロジェクトで、最初にインストールした時のままのバージョンでずっと開発をしていた、なんて事にならないように定期的にバージョンを更新していく必要があると思う(バージョン更新を後でまとめてやろうとしても変わりすぎて動かない…、なんて事もあるので1週間に1回とかできるだけ高頻度で更新するのが後々楽)。
今回は実際に勉強で作成していたプロジェクトのバージョンを更新してみたので、その備忘録を残す。

実際にパッケージの更新をやってみる

npm-check-updatesを利用する。

[root@localhost node-express]# yarn global add npm-check-updates
yarn global v1.22.17
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Installed "npm-check-updates@12.5.9" with binaries:
      - npm-check-updates
      - ncu
Done in 10.86s.

あとは以下のようにncuコマンドを実行すれば、パッケージの更新があったものを一覧で提示してくれる。
image.png

更新を行う(package.jsonを書き換える)場合には、ncu- uコマンドを実行すればいい。
image.png

続いてpackage.jsonが書き換わった後はyarn installでyarn.lock・node_modulesの更新を行えば更新作業は完了(yarn upgradeyarn install時にpackage.jsonの更新内容に基づいて最新のバージョンに更新されるので不要の認識 ← だったが、どうやらそうではなく、yarn upgradeも必要(yarn install後にyarn upgradeをしたらyarn.lockが書き換わったケースがあったので)。詳細はyarn upgrade(npm update)との違いを参照。)。

自分自身のプロジェクトでやってみた結果としては、以下のようになった。

※今回はグローバルインストールを行ったが、現在開発しているプロジェクトでのみ利用する際には、yarn add --dev npm-check-updatesでpackage.jsonに追加した後、npx ncuを実行すればグローバルにインストールしなくてもnpm-check-updatesを利用できる。

※yarnではなくnpmを利用している方は、npmとyarnのコマンド早見表等を参照する事でnpmに読み替えできると思う。

パッケージのバージョンを更新したくない時には…

公式のConfiguration Filesに書かれている
configファイル.ncurc.jsonを作成し、そのrejectの配列にパッケージ名を記載すればいい。

{
	"reject": ["vue"]
}

上記のように設定すると、以下の画像の通り、設定前のncuコマンドの実行結果にはvueのバージョン更新に関してリストが出力されているが、設定後には表示されなくなる。
image.png

この設定はプロジェクトごとの事情によりパッケージのバージョンを固定化する時などに便利。ちなみに、上記はVue2.x系とVue3.x系では全く別物なのでVueのパッケージを更新しないようにする設定。

yarn upgrade(npm update)との違い

今回上記でやった事に関して、yarn upgradeとの違いについて、少し触れておく。

まず、前提として、package.jsonとlockファイル(yarn.lockやpaclage-lock.json)との関係性についてだが、package.jsonは依存関係のあるライブラリ(パッケージ)を管理するためにあるが、全ての依存関係のあるパッケージのバージョン指定まではできない。一方、lockファイル(yarn.lock)は依存関係のある全てのライブラリ(自身が利用しているライブラリの中で依存しているライブラリまで)の依存関係を固定化するためにある(この辺りの詳細については、以下の参考に示した記事を参照)。

本題のyarn upgradeについてだが、yarn upgradeに以下のように書かれている通り、package.jsonの指定バージョン範囲で最も最新のバージョンでyarn.lockを更新するためのコマンド。つまり、package.json自体に定義されているバージョンを最新化するのではなく、既存のpackage.jsonのバージョン指定範囲で最新のバージョンにするという事をする。

This command updates dependencies to their latest version based on the version range specified in the package.json file. The yarn.lock file will be recreated as well.(package.json ファイルに指定されたバージョン範囲に基づいて、依存関係を最新バージョンに更新します。yarn.lock ファイルも同様に再作成されます。)

そのためpackage.jsonで指定しているバージョン範囲を最新にしたい場合には、yarn upgradeではダメで他のコマンドを実行する必要がある。そこで利用したのがnpm-check-updates

※package.jsonやyarn.lockで出てくる~^についてはdependenciesに詳細が書かれている。

yarn installでは何をするのか?だが、それはyarn installに書かれている通り、基本的にはyarn.lockに書かれているバージョンで各ライブラリをインストールしnode_modules以下を作成するが、もしpackage.jsonとのずれがあればpackage.jsonのバージョン指定範囲を満たすように最新のバージョンを探し出し、それに基づき各ライブラリをインストールする、という事をする。

The yarn.lock file is utilized as follows:(yarn.lockファイルは、以下のように利用されます。)

・If yarn.lock is present and is enough to satisfy all the dependencies listed in package.json, the exact versions recorded in yarn.lock are installed, and yarn.lock will be unchanged. Yarn will not check for newer versions.(yarn.lockが存在し、package.jsonに記載されているすべての依存関係を満たすのに十分であれば、yarn.lockに記録されている正確なバージョンがインストールされ、yarn.lockは変更されません。Yarnはより新しいバージョンをチェックしません。)

・If yarn.lock is absent, or is not enough to satisfy all the dependencies listed in package.json (for example, if you manually add a dependency to package.json), Yarn looks for the newest versions available that satisfy the constraints in package.json. The results are written to yarn.lock.(yarn.lockがない場合、またはpackage.jsonに記載されているすべての依存関係を満たすのに十分でない場合(例えば、手動でpackage.jsonに依存関係を追加した場合)、Yarnはpackage.jsonの制約を満たす利用できる最新のバージョンを探します。その結果はyarn.lockに書き込まれます。)

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?