Volta(元Notion)を試した(訂正)

#概要

Windows版を軽く試した。`node` のバージョン切り替えができた。プロジェクトごとにツール(`tsc` とか)のバージョンを固定する機能については~~また後で試す~~誤解しており、その機能はプロジェクトの意図するところではない、ということです。参照 [Tool does not switch to the project-specific version · Issue #452 · volta-cli/volta](https://github.com/volta-cli/volta/issues/452)

#Info

* [Volta - The JavaScript Launcher ⚡](https://volta.sh/)
* GitHub [volta-cli/volta](https://github.com/volta-cli/volta)
* RFC [volta-cli/rfcs](https://github.com/volta-cli/rfcs)
* [volta/RELEASES.md](https://github.com/volta-cli/volta/blob/master/RELEASES.md)
  まだ変更が多いのでリリースノートを見ると楽

最近 ver.0.5.0 が出てプロジェクト名が変わった。

* Notion から Jetson に名前変更すると思っていたら、いつの間にか Volta になっていた
  * 知られたNotionというものが他に存在する(間違ってイシュー報告した人を見たことがある)
* 「ハッスルフリーなJSツールチェインマネージャー」から「JSランチャー」になった

#動機

* nodeのバージョンを気軽に切り替えたい
* バージョンアップを手軽にやりたい(CLI で済むなら嬉しい)
* グローバルインストールしたくないがグローバルインストールされていてほしいときがある

Volta が解消してくれそうなので気になっていた。以前ビルドした時はさっぱり動かせなかったが、少し前にWindows版インストーラができたし名前も変わった、ということで試す。

#やった

##インストール

Windows 版はインストーラがある。

UNIX 版のインストールガイドにある `$VOLTA_HOME` は Windows でも有効に見えた(ログファイルを作れていた)が、Volta 本体がフォルダ作成に失敗するらしく、環境変数を削除してインストールをやり直した。

`C:\Program Files\Volta` (`(x86)`ではない方)に本体がインストールされ、`%LocalAppData%\Volta` に node 等が保持されていた。

**追記**
書き忘れたが、`C:\Program Files\Volta` にある `node.exe` などを実行すると、シムとの間で相互に実行してプロセス生成し続けるので(見張っててすぐ気づいたから良かったけど)やってはいけない。

## `node` のバージョンを固定

まず `volta install node@8` で ver.8 系が使えるようになる。install するとそれがデフォルトになる。

更にプロジェクト内で `volta pin node@6` とすればそのプロジェクトでは ver.6 系に固定される。

`pin` は `node` と `yarn` に対してできる。その他 `tsc` 等についてはできない。

```package.json
{
  //pin するとpackage.jsonに書かれる
  "volta": {
    "node": "6.17.1"
  }
}
```

先にこれを書いた後で `node --version` を実行した場合は、node ver.6 ダウンロードが始まった。変なバージョンを書くとエラーになる。

2つのプロジェクトを行き来して `node --version` を実行すると確かに違っている。`volta current` でも確認できる。

```console
# 別のところで volta install node@8 したあと ver.6 のプロジェクトに戻ってきた
$ volta current
project: v6.17.1 (active)
user: v8.16.0
```

REPL でも違いを確認できた。

```console
# ver.6の方
$ node
> const util = require('util');
undefined
> typeof util.promisify; # これは6には存在しない
'undefined'
> .exit

# ver.8の方に移動した
$ node
> const util = require('util');
undefined
> typeof util.promisify;
'function'
> .exit
```

`npm run foo` のときも Volta は適切なバージョンを使ってくれるらしいが、今回はそこは見ていない。

## (訂正)`tsc` のバージョンを固定……しない

(注記) コマンドラインで `fooTool ...` のように実行するときの `fooTool` のバージョンをプロジェクトごとにセットできる、という前提で書いていたがそうではなかった、ということで訂正し書き直したものです。

[Understanding Volta | Volta](https://docs.volta.sh/guide/understanding#managing-your-project)に下記のようにあった(将来変わるかもしれない)。

> ```console
> volta install typescript
> ```
> This will add the tsc executable to your toolchain, and depending on the project you’re in, this executable will switch to the project’s chosen version of TypeScript:

> ```console
> cd /path/to/project-using-typescript-2.9.2
> tsc --version # 2.9.2
> 
> cd /path/to/project-using-typescript-3.4.5
> tsc --version # 3.4.5
> ```

これを「`package.json` の `dependency` とは別にバージョン指定している」と理解していたが、そうではなかった。

参照 [Tool does not switch to the project-specific version · Issue #452 · volta-cli/volta](https://github.com/volta-cli/volta/issues/452)

グローバルインストールとの違いを(確認はしていないが)想像してみると、多分 `node` のバージョンとセットで管理していて (`%LocalAppData%` のjsonに書かれていた)そこが良いのだろうし、「プロジェクトローカルで指定されてなくて困るのなら指定すべき」ということだろうしで、納得した。

##終わりに

`node` は切り替えられたし、バグを1つ見つけて貢献できたし結構良かった。使っていきたい。