kerl

Erlangバージョン管理OTPビルドPOSIXインストールBash

GitHub概要

kerl/kerl

Easy building and installing of Erlang/OTP instances

スター1,633
ウォッチ62
フォーク238
作成日:2011年7月5日
言語:Shell
ライセンス:Other

トピックス

erlanghomebrewkerlotp-releaseshell

スター履歴

kerl/kerl Star History
データ取得日時: 2025/7/20 03:49

言語バージョン管理ツール

kerl

概要

kerlは、Erlang/OTPインスタンスの簡単なビルドとインストールを可能にする確立されたツールです。シェル非依存のPOSIXシェルスクリプトとして設計され、curlとgit以外に特別な依存関係を必要としません。ダウンロード、ビルド、インストールした各リリースを管理し、完全な再ビルドなしに新しい場所への簡単インストールや、Erlang/OTPインストール間の切り替えを実現します。Erlang公式でも認められたツールとして、多くの開発者に利用されています。

詳細

主な特徴

  • 確立された実績: Erlang/OTPコミュニティで長年愛用される信頼性
  • シェル非依存: POSIXシェルで動作し、環境に依存しない
  • 最小依存: curlとgitのみが必要な軽量ツール
  • 豊富なビルドオプション: configure時の詳細カスタマイズ
  • 名前付きビルド: 同じバージョンで異なる設定のビルド管理
  • インストール再利用: ビルド済みバージョンの複数箇所への展開
  • GitHubからのビルド: 特定コミットやブランチからの直接ビルド

アーキテクチャ

kerlは単一のBashスクリプトとして実装され、Erlang/OTPのソースコードをダウンロード、コンパイル、インストールする全工程を管理します。各ビルドは独立して管理され、activateスクリプトを通じて環境の切り替えを行います。

ビルド管理システム

kerlは「ビルド」と「インストール」を分離した設計を採用しています。一度ビルドしたバージョンは、複数の場所にインストール可能で、チーム開発や複数プロジェクトでの効率的な環境管理を実現します。

メリット・デメリット

メリット

  • 実証された安定性: 長年の運用実績による信頼性
  • シンプルな設計: 単一スクリプトによる分かりやすいアーキテクチャ
  • 高い柔軟性: 豊富なビルド設定オプション
  • 軽量: 最小限の依存関係とリソース使用
  • 再利用性: ビルド済みバイナリの効率的な展開
  • 公式支援: Erlang公式ドキュメントでの推奨
  • 広い互換性: 様々なUNIX系システムでの動作保証

デメリット

  • 長いビルド時間: ソースからのコンパイルによる時間コスト
  • 手動操作: 自動化には追加のスクリプト作成が必要
  • Windows非対応: UNIX系環境に限定
  • 学習コスト: コマンド体系に慣れが必要
  • 環境依存: システム依存関係の手動管理
  • 単発管理: 複数言語の統一管理は不可

参考ページ

書き方の例

インストール

# 直接ダウンロード(推奨)
curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl
chmod a+x kerl
sudo mv kerl /usr/local/bin/

# macOSでHomebrewを使用
brew install kerl

# Ubuntu/Debianでaptを使用
sudo apt-get install kerl

# Arch Linuxでpacmanを使用
sudo pacman -S kerl

# バージョン確認
kerl version

システム依存関係のインストール

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y \
  build-essential \
  autoconf \
  m4 \
  libncurses5-dev \
  libwxgtk3.0-gtk3-dev \
  libgl1-mesa-dev \
  libglu1-mesa-dev \
  libpng-dev \
  libssl-dev \
  libssh-dev \
  unixodbc-dev \
  xsltproc \
  fop \
  libxml2-utils

# CentOS/RHEL/Fedora
sudo yum groupinstall -y "Development Tools"
sudo yum install -y \
  autoconf \
  ncurses-devel \
  openssl-devel \
  wxGTK3-devel \
  libxml2-devel \
  libxslt-devel \
  fop

# macOS
xcode-select --install
brew install autoconf [email protected] readline libxslt fop

基本的な使い方

# 利用可能なリリースの更新と表示
kerl update releases
kerl list releases

# 特定バージョンのビルド
kerl build 27.2 erlang-27.2

# ビルド進行状況の確認
kerl status

# ビルド一覧の表示
kerl list builds

# インストールの実行
kerl install erlang-27.2 ~/erlang/27.2

# インストール一覧の表示
kerl list installations

カスタムビルド設定

# ドキュメント付きビルド
export KERL_BUILD_DOCS=yes
kerl build 27.2 erlang-27.2-docs

# SSL設定(macOS)
export KERL_CONFIGURE_OPTIONS="--with-ssl=$(brew --prefix [email protected])"
kerl build 27.2 erlang-27.2-ssl

# GUI無効化(サーバー用)
export KERL_CONFIGURE_OPTIONS="--without-wx --without-observer --without-debugger --without-et"
kerl build 27.2 erlang-27.2-server

# パフォーマンス最適化
export KERL_CONFIGURE_OPTIONS="--enable-kernel-poll --enable-hipe --disable-debug"
kerl build 27.2 erlang-27.2-optimized

# 複数オプションの組み合わせ
export KERL_CONFIGURE_OPTIONS="--with-ssl=$(brew --prefix [email protected]) --without-wx --enable-kernel-poll"
kerl build 27.2 erlang-27.2-custom

環境の切り替え

# Erlang環境をアクティベート
. ~/erlang/27.2/activate

# 現在のアクティブ環境確認
kerl active

# アクティブ環境の詳細表示
kerl status

# 環境のデアクティベート
kerl_deactivate

# 異なるバージョンへの切り替え
. ~/erlang/26.2/activate

ビルドとインストールの管理

# ワンコマンドでビルド&インストール
kerl build-install 27.2 erlang-27.2 ~/erlang/27.2

# 既存ビルドの別場所へのインストール
kerl install erlang-27.2 ~/projects/myapp/erlang

# インストールの削除
kerl delete installation ~/erlang/27.2

# ビルドの削除
kerl delete build erlang-27.2

# 全インストールの表示
kerl list installations

# 特定インストールのパス取得
kerl path erlang-27.2

Gitからの直接ビルド

# 最新のmainブランチからビルド
kerl build git https://github.com/erlang/otp.git main otp-main

# 特定のタグからビルド
kerl build git https://github.com/erlang/otp.git OTP-27.2 otp-27.2-git

# 特定のコミットからビルド
kerl build git https://github.com/erlang/otp.git abc1234 otp-commit

# ローカルリポジトリからビルド
kerl build git /path/to/local/otp.git main local-otp

プロジェクトでの活用

# プロジェクトセットアップスクリプト
#!/bin/bash
# setup-erlang.sh

PROJECT_ROOT=$(pwd)
ERLANG_DIR="$PROJECT_ROOT/.erlang"

# プロジェクト固有のErlangインストール
if [ ! -d "$ERLANG_DIR" ]; then
    echo "Installing Erlang 27.2 for this project..."
    kerl build 27.2 project-erlang-27.2 2>/dev/null || true
    kerl install project-erlang-27.2 "$ERLANG_DIR"
fi

# 環境のアクティベート
. "$ERLANG_DIR/activate"

echo "Erlang environment ready: $(erl -eval 'erlang:system_info(otp_release), halt().')"

自動化スクリプト

# Erlangバージョン自動インストール
#!/bin/bash
# auto-install-erlang.sh

VERSIONS=(
    "27.2"
    "26.2.5.6"
    "25.3.2.14"
)

for VERSION in "${VERSIONS[@]}"; do
    BUILD_NAME="erlang-$VERSION"
    INSTALL_PATH="$HOME/erlang/$VERSION"
    
    if [ ! -d "$INSTALL_PATH" ]; then
        echo "Building and installing Erlang $VERSION..."
        kerl build-install "$VERSION" "$BUILD_NAME" "$INSTALL_PATH"
    else
        echo "Erlang $VERSION already installed at $INSTALL_PATH"
    fi
done

echo "All Erlang versions installed successfully!"

CI/CDでの活用

# GitHub Actions例
name: Erlang CI with kerl
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        erlang: ['27.2', '26.2.5.6', '25.3.2.14']
    
    steps:
    - uses: actions/checkout@v4
    
    - name: Install system dependencies
      run: |
        sudo apt-get update
        sudo apt-get install -y \
          build-essential \
          autoconf \
          libncurses5-dev \
          libssl-dev \
          curl
    
    - name: Install kerl
      run: |
        curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl
        chmod a+x kerl
        sudo mv kerl /usr/local/bin/
    
    - name: Build and install Erlang
      run: |
        kerl update releases
        kerl build-install ${{ matrix.erlang }} erlang-${{ matrix.erlang }} ~/erlang/${{ matrix.erlang }}
        . ~/erlang/${{ matrix.erlang }}/activate
        erl -eval 'erlang:system_info(otp_release), halt().'
    
    - name: Run tests
      run: |
        . ~/erlang/${{ matrix.erlang }}/activate
        rebar3 compile
        rebar3 eunit

Docker統合

# Dockerfile例
FROM ubuntu:22.04

# システム依存関係のインストール
RUN apt-get update && apt-get install -y \
    curl \
    git \
    build-essential \
    autoconf \
    libncurses5-dev \
    libssl-dev \
    && rm -rf /var/lib/apt/lists/*

# kerlのインストール
RUN curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl && \
    chmod a+x kerl && \
    mv kerl /usr/local/bin/

# Erlangのビルドとインストール
ENV KERL_CONFIGURE_OPTIONS="--without-wx --without-observer --disable-debug"
RUN kerl update releases && \
    kerl build-install 27.2 erlang-27.2 /opt/erlang/27.2

# 環境変数の設定
ENV PATH="/opt/erlang/27.2/bin:$PATH"

# 作業ディレクトリの設定
WORKDIR /app

# プロジェクトファイルのコピー
COPY . .

# アプリケーションのビルド
RUN . /opt/erlang/27.2/activate && \
    rebar3 compile

# アプリケーションの起動
CMD ["/opt/erlang/27.2/bin/erl", "-noshell", "-s", "myapp", "start"]

高度な設定とトラブルシューティング

# 設定ファイルでのデフォルト値設定
# ~/.kerlrc
KERL_CONFIGURE_OPTIONS="--enable-kernel-poll --enable-hipe"
KERL_BUILD_DOCS=yes
KERL_INSTALL_MANPAGES=yes

# 並列ビルドの設定
export MAKEFLAGS="-j$(nproc)"

# ビルドエラー時のデバッグ
kerl build --verbose 27.2 debug-build

# ビルドログの確認
cat ~/.kerl/builds/erlang-27.2/otp_build_27.2.log

# キャッシュのクリア
rm -rf ~/.kerl/builds/*
rm -rf ~/.kerl/archives/*

# インストールの修復
kerl install --force erlang-27.2 ~/erlang/27.2

# アップグレード確認
kerl upgrade

複数プロジェクトでの管理パターン

# プロジェクトA (最新版)
cd ~/projects/project-a
kerl install erlang-27.2 .erlang
echo '. ./.erlang/activate' > activate.sh

# プロジェクトB (安定版)
cd ~/projects/project-b
kerl install erlang-26.2 .erlang
echo '. ./.erlang/activate' > activate.sh

# プロジェクトC (レガシー)
cd ~/projects/project-c
kerl install erlang-25.3 .erlang
echo '. ./.erlang/activate' > activate.sh

# 各プロジェクトでの起動
# cd ~/projects/project-a && source activate.sh

ベンチマークとパフォーマンステスト

# パフォーマンス最適化ビルド
export KERL_CONFIGURE_OPTIONS="--enable-kernel-poll --enable-hipe --enable-smp-support --enable-threads --disable-debug"
kerl build 27.2 erlang-27.2-performance

# ベンチマーク用スクリプト
#!/bin/bash
# benchmark.sh
VERSIONS=("25.3.2.14" "26.2.5.6" "27.2")

for VERSION in "${VERSIONS[@]}"; do
    echo "Testing Erlang $VERSION..."
    . ~/erlang/$VERSION/activate
    
    time erl -noshell -eval '
        lists:seq(1, 1000000),
        halt().
    '
    
    kerl_deactivate
done