asdf-erlang
GitHub概要
asdf-vm/asdf-erlang
Erlang plugin for asdf version manager
スター526
ウォッチ11
フォーク127
作成日:2014年11月30日
言語:Shell
ライセンス:MIT License
トピックス
なし
スター履歴
データ取得日時: 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