はじめに

環境構築をする際に、パッケージマネージャの選択に悩んだので、その備忘録。

この記事でとり扱うこと

Ubuntu 環境だとapt、Windows 環境だとwingetなどの環境標準パッケージマネージャがある。 これらは、各 OS ごとに収録されているパッケージが異なったり、プロジェクトごとにバージョンを固定したいという用途には足りないことがある。 本記事では、各 OS ごとのパッケージマネージャについて整理し、使った感想を述べる。 技術的な話はなく、ただただ主観。

Linux用

apt/dnf/zypper/pacman/aur etc

OS 標準マネージャ。 基本的に収録されているバージョンが古い。

brew

macOS でも使われている著名なパッケージマネージャ。 バイナリで入るものとビルドするものがあり、ビルドの依存関係が環境汚染に…。

nix

最近流行ってますね ほしいパッケージは大抵含まれており、望むように構築できる。 flake を使えば依存関係をプロジェクトごとに管理できる。 一方で以下の点がネックだと考える。

  • flake の書き方を覚えるのが大変
  • /nix ストレージをそこそこ持っていく
  • 依存関係のアップデート中のビルドに時間かかる

Windows用

Chocolatey

GUI でインストールできて便利だった気がする。 アンインストールができないとか(geekuninstaller を使っているので気にしない)。 wingetUniget がある今ここに戻る理由がない気もする。

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 を使うのが現実的なのかもしれない。