結論:pkgxでできること
- どんなツールもインストールなしで即実行
- システム環境を汚さない(
~/.pkgxに隔離) - バージョン指定も自由(
python@3.12、node@18など)
echo '{"name":"test"}' | pkgx jq '.name'
こんな人におすすめ
- 一時的にツールを試したいが環境を汚したくない
- ffmpegやjqなど、言語ランナーでは動かないツールも使いたい
pkgxとは
Homebrewの作者Max Howell氏による、単一バイナリの「万能ツールランナー」。
既存ツールとの比較
| ツール | 対象 | 用途 |
|---|---|---|
| npx | Node.js | npmパッケージ実行 |
| bunx | Node.js | npmパッケージ実行(単一バイナリ) |
| uvx | Python | PyPIパッケージ実行(単一バイナリ) |
| pipx | Python | PyPIパッケージ実行 |
| mise | 多言語 | ランタイム管理 |
| pkgx | 多言語 | mise/uvx/bunxを含むツール群 |
言語やエコシステムに依存しない。Node.js、Python、Ruby、Go、Rustはもちろん、ffmpegやjqなどのCLIツールまで対応。
インストール
egetでGitHub Releaseから直接取得。egetについてはGitHub Releaseを5秒でインストールする方法【Eget】を参照。
eget pkgxdev/pkgx --asset 'tar.gz'
基本的な使い方
pkgxだけでuvx/bunx/miseも動く
pkgxはuvx、bunx、mise自体も実行できる。pkgxさえあれば他のランナーのインストールすら不要。
# uvxでPythonツールを実行
pkgx uvx httpie --version
# bunxでnpmパッケージを実行
pkgx bunx cowsay "hello"
# mise execでバージョン指定実行
pkgx mise exec node@18 -- node --version
実践例
JSONを整形(jq)
echo '{"users":[{"name":"alice"},{"name":"bob"}]}' | pkgx jq '.users[].name'
動画変換(ffmpeg)
pkgx ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
バージョン指定でPythonスクリプト実行
pkgx python@3.11 -c "import sys; print(sys.version)"
shebangで依存関係ごと1ファイルに
pkgxのshebangを使えば、スクリプトファイル単体で実行環境と依存関係が完結する。Gemfileなしで配布可能。
loc.rb
#!/usr/bin/env -S pkgx +tokei ruby
# tokeiでコード行数を集計してRubyで整形
require 'json'
dir = ARGV[0] || '.'
json = `tokei -o json "#{dir}"`
data = JSON.parse(json)
total = data['Total']
puts "コード統計: #{dir}"
puts " 総行数: #{total['code']} 行"
puts " コメント: #{total['comments']} 行"
puts " 空行: #{total['blanks']} 行"
./loc.rb ./src
使えるツールの調べ方
GitHub pantryで一覧
projects/ディレクトリ配下にパッケージ定義がある。ディレクトリ名がそのままツール名として使える。
コマンドで確認
pkgx -Q jq
出力があればpkgxで実行可能。
まとめ
| やりたいこと | コマンド |
|---|---|
| ツールを即実行 | pkgx <tool> |
| バージョン指定 | pkgx <tool>@<version> |
| 利用可能か確認 | pkgx -Q <tool> |
| 依存追加してスクリプト | #!/usr/bin/env -S pkgx +<dep> <runtime> |
pkgxがあれば、どんなツールもインストールなしで即実行できる。shebangを使えば依存関係込みの単一ファイルスクリプトも配布可能になる。