Nuupa:ターミナルで迷わずグローバル依存関係を更新する
グローバルに入れたパッケージを更新するとき、私はいつも似たコマンドを打っていました。npmを確認し、pnpmも見て、そういえばBunにも何か入れていた気がする、と考える。更新後に、どれが古いままなのか忘れることもあります。
大事故ではありません。ターミナルで済む話です。でも、何度も繰り返す小さな面倒は気になります。そこから作り始めたのがNuupaです。
Rustを学ぶなら、練習用のCLIではなく、自分が本当に使う小さな道具がよかった。これがもう一つの動機でした。
ターミナルを置き換えたいわけではない
Nuupaが扱うのは、npm、pnpm、Bunでグローバルに入れたパッケージだけです。プロジェクトの依存関係、workspace、lockfileには触れません。そこまで広げると、互換性やテストまで考える別のアプリになります。
起動すると、使えるパッケージマネージャーを見つけ、それぞれを分けて表示します。インストール済みと最新のバージョン、更新が必要かどうかを見て、一つだけ更新することも、まとめて順番に更新することもできます。進捗はその場で見えます。
更新したくないものは除外できます。ただし、必要になれば手動では更新できる。このくらいの緩さが私は好きです。自動処理から外すことと、永久に禁止することは同じではありません。
実行中の更新は止められますが、巻き戻しはありません。すでに終わった更新はそのままです。外部のパッケージマネージャーを順番に動かしている以上、存在しないトランザクションを装うより正直だと思います。
細かなところでは、npmは現在有効なnvmのNodeバージョンに従います。また、npm outdatedは更新対象があると終了コード1を返します。これは失敗ではなく有用な結果なので、バックエンド側で普通のエラーとして捨てないようにしました。CLIをGUIで包むと、こういう癖が急に近くなります。
Vueを足場にRustへ入る
画面はVue 3、デスクトップ側はTauri 2とRustです。Vueは慣れているので、進捗や状態の見せ方で余計に迷わずに済みました。その安心できる場所を残したまま、Rustではプロセスの起動、出力、エラー、キャンセルを考える。この組み合わせがちょうどよかったです。
Rustだけで小さなCLIを書くより、私は多くを学べました。画面から操作が来て、バックエンドが外部コマンドを動かし、途中経過を返す。所有権やエラー処理が練習問題ではなく、アプリの都合として目の前に出てきます。
普段のWebの仕事では、ドキュメントを読み、コンパイルし、テストを通し、SonarQubeを確認し、その先にも似たパイプラインが続きます。必要な仕事ですが、今回は少し違いました。自分のマシンで小さなウィンドウが開き、ローカルの道具を直接整理してくれる。久しぶりに新鮮な開発体験でした。
配布まで触って、デスクトップだと実感した
GitHub Actionsのリリースでは、macOSのarm64とx64、Linuxのx64とarm64、Windowsのx64という五つのターゲットをビルドします。各環境向けのインストーラーや成果物を作り、バージョンも検証します。
Webならブラウザやコンテナが隠してくれる差を、デスクトップでは無視できません。CPUアーキテクチャも配布形式も急に身近になります。画面が動いた時点では終わっていない。その感覚が面白かったです。
Linux arm64向けRPMの一つは、観測時に約4.26 MBでした。小さいのはうれしい。ただし、これは一つの成果物のサイズであって、性能のベンチマークではありません。数字だけを切り出して褒める気はありません。
現在確認しているアプリのバージョンは0.3.5です。一方で、TauriとCargo側は0.3.5、ルートのpackage.jsonは0.3.1でした。すべてのマニフェストがそろっているとは言えません。こういう小さなずれは、派手ではないのに配布を面倒にします。
良かった点
- 用途が狭く、開いてから迷わないこと。
- 慣れたVueを足場に、Rustを実際の道具の中で学べたこと。
- 五つの環境へ配るところまで経験できたこと。
懸念点
- 対応はnpm、pnpm、Bunのグローバルパッケージだけです。
- キャンセルしても完了済みの更新は戻りません。
- 外部CLIの出力や挙動が変われば追従が必要です。
- マニフェスト間のバージョン差は直したいところです。
小さな不便には、小さなアプリでいい
Nuupaはパッケージ管理を再発明しません。私は今でもターミナルを使いますし、問題が起きればそこへ戻ります。
それでも、三つのパッケージ空間を行き来して更新漏れを考えるより、一覧を見て必要なものだけ動かせるほうが気楽です。その数分のためにアプリを作るのは少し大げさかもしれません。でも、その大げささのおかげでRustを学び、Tauriでの配布に触れ、いつものWebとは違う空気を楽しめました。
機能をむやみに増やすより、まずは今の範囲を安定させたい。便利さは機能の数ではなく、閉じたあとに頭の中が少し静かになるかどうかで決まる気がしています。