name: install-creator
description: Create install scripts under ./install/install-.sh following this dotfiles repo's build/install conventions (brew vs self-build, pkg/local layout, OS branching).
install-creator
このドキュメントは、./install/install-<name>.sh を
この dotfiles リポジトリの規約に沿って作成するための正本手順です。
使う場面
- 新しいツールを dotfiles にビルド可能な形で追加したい
- mac / linux 両対応の install スクリプトを書きたい
$DOTFILES/pkgと$DOTFILES/localの規約に従って自前ビルドしたい
前提となるディレクトリ規約
install/install-<name>.shがスクリプト本体$DOTFILES/pkg/<name>: ビルドが必要なとき のソース取得先$DOTFILES/local/<name>: ビルド結果の install 先 (make installの--prefix)- ビルド不要 (解凍するだけ / プレビルドバイナリ) の場合は、
pkgを経由せずlocal/<name>に直接展開する
- ビルド不要 (解凍するだけ / プレビルドバイナリ) の場合は、
- ダウンロードは可能な限り
gh release downloadを優先する (認証・レート制限が扱いやすいため) - PATH 追加は このスクリプトでは絶対にやらない。
zsh/側の個別設定でaddToPathを呼ぶ - 再実行時は冒頭で対象ディレクトリを必ず削除してから入れ直す (冪等性を確保する)
手順
まず判定する (このフローを上から順に試す)
homebrew にあるか
brew search <name>かbrew info <name>で確認- あれば
Brewfileに追加するだけで済むので、そもそもスクリプトは不要
mac は brew、linux だけ自前
- formula が mac しかない / linux 版が古い
- → OS 分岐スクリプト (パターン B)
プレビルドバイナリをそのまま置きたい (ビルド不要)
- 配布物が実行可能バイナリ or アーカイブで、展開するだけで使える
- → 解凍のみパターン (パターン C)
pkgを経由せず$DOTFILES/local/<name>に直接展開する
完全に自前ビルド
- brew formula がない / 特殊なビルドオプションが欲しい
- → 自前ビルドスクリプト (パターン D)
公式インストーラがある
curl ... | bashのような公式手順が存在する- → インストーラ呼び出し (パターン E)
ファイル名は
install/install-<name>.sh
<name>は導入後のコマンド名に合わせる- 例:
install-brotli.sh,install-nghttp2.sh
先頭は
#!/usr/bin/env zsh取得方法
gh release download -R <owner>/<name> ...が使えるなら優先する- 次点で
curl -LO https://... - 最後に
git clone --depth 1 ...(ソースツリーが必要なとき)
- 冪等性 (必須)
- 自前ビルドの場合は冒頭で
rm -rf $DOTFILES/pkg/<name>とrm -rf $DOTFILES/local/<name> - ビルド不要 (解凍のみ) の場合は
rm -rf $DOTFILES/local/<name>のみ - 再実行すれば古いものを削除してから入れ直す、を前提にする
- 権限と副作用
sudo apt installは linux ブランチ内でのみ使う- mac 側で
sudoは使わない (brew が不要な権限昇格を避ける)
- PATH は通さない (必須)
install-<name>.sh内でexport PATH=...やaddToPath ...を書かない.zshrcやzsh/*.zsh側で個別にaddToPath $DOTFILES/local/<name>/binなどを追記する- このスクリプトの責務は「置く」まで
- 終わったらテスト
zsh install/install-<name>.shで実走$DOTFILES/local/<name>/bin/<name> --version等で確認- PATH は別途
zsh/側で対応 (上記 7 参照)
パターン集
パターン A: brew のみ
#!/usr/bin/env zsh
brew install <name>
パターン B: mac/linux で分岐
linux に brew formula がない / tap が必要な場合:
#!/usr/bin/env zsh
if [[ `uname` == "Linux" ]]; then
brew tap <owner>/<tap> && brew install <name>
elif [[ `uname` == "Darwin" ]]; then
brew install <name>
fi
mac は brew、linux だけ自前ビルドする場合:
#!/usr/bin/env zsh
if [[ `uname` == "Darwin" ]]; then
echo "install via brew"
exit 0
fi
# linux からの処理を続ける
cd $DOTFILES/pkg
rm -rf $DOTFILES/pkg/<name>
rm -rf $DOTFILES/local/<name>
# ... (パターン C を参照)
パターン C: ビルド不要 (解凍のみ、local に直接展開)
プレビルドバイナリ / アーカイブを落として展開するだけで済む場合。
pkg は使わず、local/<name> に直接展開する。
#!/usr/bin/env zsh
rm -rf $DOTFILES/local/<name>
mkdir -p $DOTFILES/local/<name>
cd $DOTFILES/local/<name>
gh release download -R <owner>/<name> --pattern "*linux-amd64.tar.gz" --output <name>.tar.gz
tar zxvf <name>.tar.gz --strip-components=1
rm <name>.tar.gz
- 実行可能バイナリ 1 ファイルだけなら:
#!/usr/bin/env zsh
rm -rf $DOTFILES/local/<name>
mkdir -p $DOTFILES/local/<name>/bin
gh release download -R <owner>/<name> --pattern "<name>-linux-amd64" --output $DOTFILES/local/<name>/bin/<name>
chmod +x $DOTFILES/local/<name>/bin/<name>
- PATH 追加はこのスクリプトでやらない。後述の通り
zsh/側でaddToPath $DOTFILES/local/<name>/binする
パターン D: 自前ビルド
D-1: cmake
#!/usr/bin/env zsh
cd $DOTFILES/pkg
rm -rf $DOTFILES/pkg/<name>
rm -rf $DOTFILES/local/<name>
gh release download -R <owner>/<name> --archive tar.gz --output <name>.tar.gz
result=`unpack <name>.tar.gz`
version=`echo $result | head -n2 | tail -n1`
mv $version <name>
cd $DOTFILES/pkg/<name>
mkdir $DOTFILES/local/<name>
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$DOTFILES/local/<name>
cmake --build . --config Release --target install
D-2: autoconf / make
#!/usr/bin/env zsh
# linux 依存 (必要なら)
sudo apt install -y \
autoconf \
automake \
libtool \
pkg-config
cd $DOTFILES/pkg
DEST=$DOTFILES/pkg/<name>
rm -rf $DEST
rm -rf $DOTFILES/local/<name>
git clone --depth 1 https://github.com/<owner>/<name> $DEST
cd $DEST
autoreconf -i
automake
autoconf
./configure --prefix=$DOTFILES/local/<name>
make
make install
D-3: tarball (バージョン固定、gh が使えないとき)
#!/usr/bin/env zsh
export VERSION=<x.y.z>
cd $DOTFILES/pkg
rm -rf $DOTFILES/pkg/<name>-${VERSION}
rm -rf $DOTFILES/local/<name>
curl -LO https://example.com/<name>-${VERSION}.tar.gz
tar zxvf <name>-${VERSION}.tar.gz
cd <name>-${VERSION}
./configure --prefix=$DOTFILES/local/<name>
make
make install
パターン E: 公式インストーラ
#!/usr/bin/env zsh
curl -fsSL https://example.com/install.sh | bash
curl | bashは最小限に留める (改ざん検知が弱い)- 可能なら checksum を追加する
シェルスクリプトのスタイル
リポジトリ共通規約 (CLAUDE.md 参照) に従う:
- インデントはスペース 2 つ
if [[を使う ([やtestは使わない)- 文字列一致は
==/!=と*"string"*の組み合わせ - 変数有無は
-z/-n - ファイル有無は
-f/-d - コマンド有無は
[[ -x "$(command -v foo)" ]] - 全角記号を使わない
検証チェックリスト
- shebang が
#!/usr/bin/env zsh - 冒頭で対象ディレクトリを
rm -rfしている (再実行で入れ直せる)- ビルドあり:
$DOTFILES/pkg/<name>と$DOTFILES/local/<name>両方 - 解凍のみ:
$DOTFILES/local/<name>のみ
- ビルドあり:
- ダウンロードは可能なら
gh release downloadを使っている - ビルドするときは
cd $DOTFILES/pkgで作業、ビルド結果は$DOTFILES/local/<name>に入れる - ビルドしないときは
pkgを使わず$DOTFILES/local/<name>に直接展開している -
--prefix=$DOTFILES/local/<name>を渡している (make install する場合) - PATH を通すコード (
export PATH=/addToPath) が入っていない - linux 側の
sudo apt installは必要最小限 - mac 側で
sudoを使っていない - 末尾に改行あり、改行だけの行で終わっていない
判断が難しいケース
- brew にあるが古い: Brewfile に書きつつ、必要に応じて
install-<name>.shで自前版を用意 (両立可) - ビルドに大量の依存パッケージが要る: D-2 のように
apt installを明示。mac 側は brew が依存を吸収するので触らなくて良い - プレビルドバイナリを落とすだけ: パターン C を使う。
pkgを経由せず$DOTFILES/local/<name>に直接展開する - 取得元が github release:
gh release downloadを優先 (認証・レート制限が楽)。public で非認証で良いときのみcurl -LO - PATH 追加はどこでする?: このスクリプトでは 絶対にやらない。
zsh/側の該当ファイルにaddToPath $DOTFILES/local/<name>/binを自分で追加する