asdf-erlang

Erlangasdfバージョン管理OTPkerlコンパイルプラグイン

GitHub概要

asdf-vm/asdf-erlang

Erlang plugin for asdf version manager

スター526
ウォッチ11
フォーク127
作成日:2014年11月30日
言語:Shell
ライセンス:MIT License

トピックス

なし

スター履歴

asdf-vm/asdf-erlang Star History
データ取得日時: 2025/10/22 04:10

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

asdf-erlang

概要

asdf-erlangは、asdfバージョンマネージャー用のErlang/OTPプラグインです。内部でkerlを使用してErlang/OTPをソースからコンパイル・インストールし、複数のErlangバージョンを管理できます。Erlang公式でも認められたサードパーティツールとして、クロスプラットフォーム対応と豊富なビルドオプションを提供します。Elixir開発者にとって、asdf-elixirと組み合わせた統一的なバージョン管理の基盤となります。

詳細

主な特徴

  • kerl統合: 内部でkerlを使用したソースからのビルド
  • OTPバージョン管理: Erlang/OTPの全バージョンをサポート
  • カスタムビルド: ビルド時の豊富な設定オプション
  • SSL/TLS対応: OpenSSLライブラリとの連携
  • ドキュメントビルド: オプションでErlangドキュメントの生成
  • asdf統合: 統一的なバージョンマネージャーとしての活用
  • クロスプラットフォーム: Linux、macOS、WSLをサポート

アーキテクチャ

asdf-erlangは内部でKerl(Erlang Installation Tool)を使用してErlang/OTPをソースからコンパイルします。ビルド済みバイナリを~/.asdf/installs/erlang/に配置し、asdfのshimシステムを通じてバージョン切り替えを実現します。各プロジェクトの.tool-versionsファイルでバージョンを指定できます。

kerlとの関係

kerlはErlang/OTPをソースからビルドするためのBashスクリプトツールです。asdf-erlangはkerlをラップしてasdfエコシステムに統合し、設定の簡素化と他言語との統一管理を実現しています。

OTP互換性の重要性

ErlangはOTP(Open Telecom Platform)を含む統合システムです。ElixirやErlang-basedなアプリケーションは特定のOTPバージョンとの互換性が重要で、asdf-erlangによる正確なバージョン管理がシステム安定性の鍵となります。

メリット・デメリット

メリット

  • Erlang公式認定: Erlang公式ドキュメントで言及される信頼性
  • 完全なバージョン制御: 古いバージョンから最新まで幅広くサポート
  • カスタムビルド: SSL、GUI、ドキュメント等の柔軟な設定
  • asdf統合: 他言語との統一管理でチーム開発に最適
  • Elixir連携: asdf-elixirとの完璧な組み合わせ
  • 豊富なオプション: kerlの全機能を活用可能
  • 継続サポート: アクティブな開発とメンテナンス

デメリット

  • 長いビルド時間: ソースコンパイルによる時間コスト
  • 依存関係複雑: システムレベルの開発ライブラリが必要
  • ディスク容量: 複数バージョンの並行インストール
  • 初期設定: プラットフォーム固有の依存関係設定
  • メモリ使用: コンパイル時の高いリソース消費
  • トラブルシューティング: ビルドエラー時の原因特定の困難

参考ページ

書き方の例

事前準備(asdfのインストール)

# asdf本体のインストール(Linux/macOS)
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

# シェル設定(Bash)
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.bashrc

# シェル設定(Zsh)
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.zshrc
echo 'fpath=(${ASDF_DIR}/completions $fpath)' >> ~/.zshrc
echo 'autoload -Uz compinit && compinit' >> ~/.zshrc

# 設定の再読み込み
source ~/.bashrc  # または ~/.zshrc

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

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y \
  build-essential \
  autoconf \
  m4 \
  libncurses5-dev \
  libwxgtk3.0-gtk3-dev \
  libwxgtk-webview3.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 (Homebrew)
brew install \
  autoconf \
  [email protected] \
  libyaml \
  readline \
  libxslt \
  fop

プラグインのインストール

# Erlangプラグインの追加
asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git

# インストール済みプラグインの確認
asdf plugin list

# プラグインの更新
asdf plugin update erlang

バージョンの確認とインストール

# 利用可能なErlangバージョンの確認
asdf list all erlang

# 推奨される2025年現在のバージョン
# 最新安定版(OTP 27)
asdf install erlang 27.2

# 長期サポート版(OTP 26)
asdf install erlang 26.2.5.6

# 古いバージョン(OTP 25)
asdf install erlang 25.3.2.14

# 開発版(最新)
asdf install erlang main

ビルド設定のカスタマイズ

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

# ドキュメント付きビルド
export KERL_BUILD_DOCS=yes

# GUI無効化(サーバー環境)
export KERL_CONFIGURE_OPTIONS="--without-wx --without-observer --without-debugger --without-et"

# デバッグ無効化(本番向け)
export KERL_CONFIGURE_OPTIONS="--disable-debug --without-javac"

# カスタム設定でインストール
asdf install erlang 27.2

バージョンの設定

# グローバルバージョンの設定
asdf global erlang 27.2

# プロジェクトローカルバージョンの設定
cd /path/to/your/project
asdf local erlang 27.2

# 現在のバージョン確認
asdf current erlang
erl -eval 'erlang:system_info(otp_release), halt().'

# インストール済みバージョンの確認
asdf list erlang

.tool-versionsファイルの活用

# プロジェクトディレクトリでの設定
cd myproject

# .tool-versionsファイルの作成
echo "erlang 27.2" >> .tool-versions

# ElixirとErlangの組み合わせ
echo "erlang 27.2" > .tool-versions
echo "elixir 1.17.3-otp-27" >> .tool-versions

# ファイル内容の確認
cat .tool-versions
# erlang 27.2
# elixir 1.17.3-otp-27

# .tool-versionsに基づくバージョンインストール
asdf install

プロジェクト環境の切り替え

# プロジェクト1(最新環境)
cd ~/projects/modern-app
asdf local erlang 27.2
erl -version

# プロジェクト2(安定版環境)
cd ~/projects/stable-app
asdf local erlang 26.2.5.6
erl -version

# プロジェクト3(レガシー環境)
cd ~/projects/legacy-app
asdf local erlang 25.3.2.14
erl -version

Erlangアプリケーションの開発

# Erlang開発環境のセットアップ
asdf local erlang 27.2

# Erlang REPLの起動
erl

# Erlangコードのコンパイルと実行
# hello.erl
echo '-module(hello).
-export([hello_world/0]).

hello_world() ->
    io:format("Hello, World!~n").
' > hello.erl

# コンパイルと実行
erlc hello.erl
erl -noshell -s hello hello_world -s init stop

# Rebarを使用したプロジェクト作成
rebar3 new app myapp
cd myapp
rebar3 compile
rebar3 shell

CI/CDでの活用

# GitHub Actions例
name: Erlang CI
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
    
    - name: Install asdf
      run: |
        git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0
        echo ". $HOME/.asdf/asdf.sh" >> $GITHUB_ENV
    
    - name: Install Erlang
      run: |
        export PATH="$HOME/.asdf/bin:$PATH"
        . $HOME/.asdf/asdf.sh
        asdf plugin add erlang
        asdf install erlang ${{ matrix.erlang }}
        asdf global erlang ${{ matrix.erlang }}
    
    - name: Run tests
      run: |
        erl -version
        rebar3 compile
        rebar3 eunit
        rebar3 ct

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/*

# asdfのインストール
RUN git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

# 環境変数の設定
ENV PATH="$HOME/.asdf/bin:$HOME/.asdf/shims:$PATH"

# Erlangプラグインのインストール
RUN . ~/.asdf/asdf.sh && \
    asdf plugin add erlang

# Erlangのインストール(ドキュメント無し、GUI無し)
ENV KERL_CONFIGURE_OPTIONS="--without-wx --without-observer --without-debugger --without-et --disable-debug"
RUN . ~/.asdf/asdf.sh && \
    asdf install erlang 27.2 && \
    asdf global erlang 27.2

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

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

# rebar3の設定
RUN . ~/.asdf/asdf.sh && \
    rebar3 compile

# アプリケーションの起動
CMD ["./_build/default/rel/myapp/bin/myapp", "foreground"]

パフォーマンス最適化

# 並列ビルドの有効化
export MAKEFLAGS="-j$(nproc)"

# 高速ビルド用設定
export KERL_CONFIGURE_OPTIONS="--disable-debug --without-javac --without-wx"

# メモリ制限でのビルド
export KERL_CONFIGURE_OPTIONS="--enable-kernel-poll --enable-hipe"

# クロスコンパイル設定
export KERL_CONFIGURE_OPTIONS="--host=x86_64-linux-gnu"

トラブルシューティング

# ビルドに失敗した場合のクリーンアップ
asdf uninstall erlang 27.2

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

# 依存関係の再確認(Ubuntu)
sudo apt-get update
sudo apt-get install --reinstall \
  build-essential \
  autoconf \
  libncurses5-dev \
  libssl-dev

# macOSでのSSL問題解決
export KERL_CONFIGURE_OPTIONS="--with-ssl=$(brew --prefix [email protected])"
export LDFLAGS="-L$(brew --prefix [email protected])/lib"
export CPPFLAGS="-I$(brew --prefix [email protected])/include"

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

# kerlの直接実行(デバッグ)
$HOME/.asdf/plugins/erlang/bin/kerl list installations
$HOME/.asdf/plugins/erlang/bin/kerl build 27.2 asdf_27.2

バージョンアップグレード手順

# 現在のバージョン確認
asdf current erlang

# 利用可能な新しいバージョンの確認
asdf list all erlang | tail -5

# 新しいバージョンのインストール
asdf install erlang 27.2

# プロジェクトでの段階的アップグレード
cd myproject

# バックアップの作成
cp .tool-versions .tool-versions.backup

# 新しいバージョンの設定
asdf local erlang 27.2

# 依存関係の確認とテスト
rebar3 compile
rebar3 eunit

# 問題がある場合はロールバック
# cp .tool-versions.backup .tool-versions

リリース管理とデプロイ

# リリースビルドの作成
export KERL_CONFIGURE_OPTIONS="--disable-debug --enable-kernel-poll"
asdf install erlang 27.2

# 本番環境向けコンパイル
rebar3 as prod release

# リリースの確認
ls -la _build/prod/rel/*/bin/

# Docker用軽量ビルド
export KERL_CONFIGURE_OPTIONS="--without-wx --without-observer --without-debugger --without-et"
asdf install erlang 27.2-minimal