パッケージマネージャについて
はじめに
環境構築をする際に、パッケージマネージャの選択に悩んだので、その備忘録。
この記事でとり扱うこと
Ubuntu 環境だとapt
、Windows 環境だとwinget
などの環境標準パッケージマネージャがある。
これらは、各 OS ごとに収録されているパッケージが異なったり、プロジェクトごとにバージョンを固定したいという用途には足りないことがある。
本記事では、各 OS ごとのパッケージマネージャについて整理し、使った感想を述べる。
技術的な話はなく、ただただ主観。
Linux用
apt/dnf/zypper/pacman/aur etc
OS 標準マネージャ。 基本的に収録されているバージョンが古い。
brew
macOS でも使われている著名なパッケージマネージャ。 バイナリで入るものとビルドするものがあり、ビルドの依存関係が環境汚染に…。
nix
最近流行ってますね ほしいパッケージは大抵含まれており、望むように構築できる。 flake を使えば依存関係をプロジェクトごとに管理できる。 一方で以下の点がネックだと考える。
- flake の書き方を覚えるのが大変
/nix
ストレージをそこそこ持っていく- 依存関係のアップデート中のビルドに時間かかる
Windows用
Chocolatey
GUI でインストールできて便利だった気がする。
アンインストールができないとか(geekuninstaller を使っているので気にしない)。
winget
とUniget
がある今ここに戻る理由がない気もする。
Scoop
ユーザー権限にバイナリをインストールするため、環境汚染が少ない。
気に入らなければ、~/scoop
を消してしまえば良い。
まれに Windows Defender に引っかかることがあるため、~/scoop
を Windows Defender の除外設定すると良い。
検索がローカルの json 探索で重いため、Dev Driveとするのもあり。
scoop-search
を入れてあげると検索が早くなる。
自前のリポジトリを作るのが簡単。
winget
Windows 公式のパッケージマネージャ winget と msstore のソースを持つ。 たまに、アップデートでこける(バックエンドのテクノロジーが違うとか)
結論
これらはインストーラ代替の側面が強く、プロジェクト単位での開発環境を分離するためのものではない。 Windows 環境下でプロジェクト単位の環境構築をしたい場合、別のツールを使う必要がある。
Linux/Windows 両対応
aqua
バイナリやクラウド系のパッケージはよく見つかる。 プロジェクトごとに管理できる。
Pixi
Anaconda 系のパッケージマネージャ。 元の Anaconda は環境汚染をするイメージがあったが、Pixi はどうなのだろう(まだ試してない)。
所感
私の今の環境では、以下の組み合わせになっている。
- Linux:OS パッケージマネージャ+Nix
- Windows が winget+scoop プロジェクトごとに環境を作りたい場合は、現状考慮していない。
Linux 限定として Nix で管理を試してみたが、以下のサイクルに陥った。
1. flake.lock を定期的にアップデートする必要がある
2. Actions で自動更新する
3. ローカルも頻繁にリビルドが必要で面倒
Nix 自体は良かったが、flake.lock を長い期間で使い回せないか検討したい。 (Nix と flake に対する理解を間違っている気もする)
CLI ツールを Linux と Windows 間で共有したい場合のベストプラクティスはまだ見つけていない。 現状は nix profile と scoop に同じツールを予めインストールしておくくらいだろうか。
aqua では clang-format など微妙にほしいツールが足りていないこともありメインになっていない。 現状の複数の CLI が必要な場合は、Docker を使うのが現実的なのかもしれない。