kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Voltaでnpmパッケージのグローバルインストール

f:id:kun432:20220319174947p:plain

前回、npmパッケージのグローバルインストールが期待したとおりの動きにならなかったVoltaだけど、

ちょっとやりなおしてみて、やりたいことはできたのでまとめます。前提として、自分なりの理解なので間違ってるかもしれませんが。

目次

Voltaにおけるパッケージのグローバルインストールの考え方

あらためてVoltaのブログを見てみた。

  • By running volta install mocha, you let Volta know that you want mocha to be available everywhere in your terminal. Volta will download the latest version (or if you want you can specify a specific version) to use as the default.
  • From that point forward, you’ll be able to run that default version of mocha directly in your terminal, just as if you had globally installed it with npm.
  • However, if you run mocha in a project that has the mocha package as a dependency, Volta will automatically delegate to the local version installed in node_modules, without you having to change the command at all.

あと、もう一つ。volta install パッケージ名はどうも以前のバージョンでのやり方みたいで、今は普通にnpm/yarnが使えるようになっている。

Installing global packages with Volta has many benefits over traditional globals. Until now, to take advantage of those benefits, you needed to install the packages using volta install instead of your package manager. With Volta 0.9.0, you can now install packages directly using your package manager and still get the upside that Volta provides:

これをまとめるとこうなる。

  • npm install -g パッケージ名を実行すると、Voltaはそのパッケージをグローバルに実行されるツールとして認識し、そしてデフォルトのツールセットとしてインストールする。
  • プロジェクト内でローカルインストールされたパッケージがある場合は、Voltaはグローバルにインストールされたものとは別の物と認識して、こちらを優先する。

前回イメージしていたものとは違ったのはこのあたりなのかも、ということでやってみる。

グローバルにインストールするパッケージをプロジェクトごとに分ける

Voltaでnodeを複数バージョンインストールする。最終的なデフォルトはnode@17.7.2。

$ volta install node@16.14.1
success: installed and set node@16.14.1 (with npm@8.5.0) as default
$ volta install node@16.14.2
success: installed and set node@16.14.2 (with npm@8.5.0) as default
$ volta install node@latest
success: installed and set node@17.7.2 (with npm@8.5.2) as default

$ volta list all
⚡️ User toolchain:

    Node runtimes:
        v16.14.1
        v16.14.2
        v17.7.2 (default)

    Package managers:


    Packages:

プロジェクトを作る

$ for i in a b
> do
> mkdir proj_${i} && cd proj_${i} && npm init -y && cd ..
> done

proj_aはnode.js-16.14.1、proj_bはnode.js-16.4.2でvolta pinしておく。

$ cd proj_a
$ volta pin node@16.14.1
success: pinned node@16.14.1 (with npm@8.5.0) in package.json
$ volta list
⚡️ Currently active tools:

    Node: v16.14.1 (current @ /home/vagrant/proj_a/package.json)
    Tool binaries available: NONE

See options for more detailed reports by running `volta list --help`.
$ cd ..

$ cd proj_b
$ volta pin node@16.14.2
success: pinned node@16.14.2 (with npm@8.5.0) in package.json
$ volta list
⚡️ Currently active tools:

    Node: v16.14.2 (current @ /home/vagrant/proj_b/package.json)
    Tool binaries available: NONE

See options for more detailed reports by running `volta list --help`.
$ cd ..

グローバルにパッケージをインストールする。今回はtypescriptパッケージでやってみる。

$ npm install -g typescript
$ tsc -v
Version 4.6.2

この時点での、proj_a/bそれぞれでtypescriptパッケージをどう見ているか?を見てみる。

$ cd proj_a
$ tsc -v
Version 4.6.2
$ volta list
⚡️ Currently active tools:

    Node: v16.14.1 (current @ /home/vagrant/proj_a/package.json)
    Tool binaries available:
        tsc, tsserver (default)

See options for more detailed reports by running `volta list --help`.
$ cd ..

$ cd  proj_b
$ tsc -v
Version 4.6.2
$ volta list
⚡️ Currently active tools:

    Node: v16.14.2 (current @ /home/vagrant/proj_b/package.json)
    Tool binaries available:
        tsc, tsserver (default)

See options for more detailed reports by running `volta list --help`.
$ cd ..

前回と同じ。どちらのプロジェクトからもグローバルにインストールされたtypescriptパッケージが見えている。

では、プロジェクトのローカルにtypescriptの別バージョンをインストールしてみる。

$ cd proj_a
$ npm install typescript@4.1.5
$ tsc -v
Version 4.1.5
$ volta list
⚡️ Currently active tools:

    Node: v16.14.1 (current @ /home/vagrant/proj_a/package.json)
    Tool binaries available:
        tsc, tsserver (current @ /home/vagrant/proj_a/package.json)

See options for more detailed reports by running `volta list --help`.
$ cd ..

$ cd proj_b
$ npm install typescript@3.9.4
$ tsc -v
Version 3.9.4
$ volta list
⚡️ Currently active tools:

    Node: v16.14.2 (current @ /home/vagrant/proj_b/package.json)
    Tool binaries available:
        tsc, tsserver (current @ /home/vagrant/proj_b/package.json)

See options for more detailed reports by running `volta list --help`.

ちゃんとプロジェクトごとにバージョンが違うtypescriptパッケージが読まれていて、そしてnpxをつけなくてもちゃんとnode_modules内のバイナリを見てくれているのがわかる。

プロジェクトディレクトリ外はどうなっているかというと、

$ cd ..
$ tsc -v
Version 4.6.2
$ volta list
⚡️ Currently active tools:

    Node: v17.7.2 (default)
    Tool binaries available:
        tsc, tsserver (default)

See options for more detailed reports by running `volta list --help`.

こちらはデフォルトのtypescriptパッケージが呼び出されている。やっと想定通りになった。

まとめ

これなら安全に使えそうだし、いちいちnpxやpackage.jsonにscripts追加しなくていいので、かなり楽に使えそうです