介绍Erlang/OTP两种安装方式及使用又拍云镜像解决国内下载源码超级慢问题。

Erlang/OTP安装方式

类型 优点 缺点
二进制安装包 完整release包(包含依赖周边) 无法修改编译参数(比如在原release上再加hipe参数)
源码构建安装 允许自定义各种编译参数 需要按需安装依赖,安装过程复杂且构建时间长
  • 二进制包安装 Windows系统下载*.exe,即开即用。
  • 源码安装 下载*.tar.gz,安装各种依赖,配置环境变量,解压后make & make install

Erlang/OTP下载来源

  • Erlang org 最权威下载源,包含所有历史版本的源码(文档)及Windows版的*.exe
  • Erlang Github Release 提供历史版本的所有的源码(文档)。
  • Erlang Solution 提供主流操作系统的多种编译选项组合的二进制安装包,及部分老版本的源码。
  • 又拍云镜像 http://erlang.b0.upaiyun.com (直接点击链接无法访问)是erlang.org下载镜像站,国内下载速度超快。后续会详细介绍:使用它改造asdf做到下载Erlang只要30秒,彻底解决国内下载Erlang源慢的问题。

二进制安装包

二进制安装包的安装非常简单,直接解压运行exe或./Install按提示配置。关键在于如何选择下载源?
Erlang Solution提供主流系统(Ubuntu、CentOS、Mac OS X、Debian、Windows、Fedra、Raspbian)的各种编译好的二进制版本。主要优势有:

  • 提供最新稳定OTP包,操作系统自带源版本更新通常会滞后,比如Ubuntu 12.04 LTS Precise Pangolin 系统自带源最新为R14B02时,Erlang solution已为它提供R16B02
  • 如果你需要安装hipe编译的包,也有提供:erlang-base-hipe
  • 灵活提供了多种含有不同Application的源:erlang,esl-erlang,erlang-base package
类型(package) 描述
erlang 包括所有OTP组件及OTP Suite,没有erlang-doc erlang-manpages erlang-mode
esl-erlang 里面包含所有的OTP组件,比erlang package体积大一些
erlang-base 里面只包含了必要OTP组件,只有大约13M

除了直接在Erlang Solution网页里下载二进制包,然后再解压使用外,更加推荐使用Erlang Solution源替换系统原有的源,这样就可以使用系统自带的包管理工具管理它,操作系统使用的包管理工具各不相同,Elixir官网提供了一份非常详细的指引

源码构建安装

当找不到满足需求的二进制包时 ,就必须选择源码安装。

基本流程

  1. 安装必要依赖工具(解压&编译工具),例如:unzip make gcc Perl5 m4 ncurses termcap
  2. 根据需要安装Application依赖,例如:crypto(OpenSSL) observer(wxWidgets)
  3. 下载*tar.gz, 设置你需要选项的环境变量
  4. ./configure & make & make install

上面四步是源码安装必须的过程,所以社区大佬们想尽办法把这些繁杂过程写成脚本,让安装方便一些。其中功能做得全且好用被大家一致认可的有asdfkerl

Kerl(Easy building and installing of Erlang/OTP)

kerl是专注于构建安装Erlang/OTP程序的纯shell脚本,没有任何依赖。特点是:

  • 可以同时安装多个版本的OTP并随意在不同版本间切换。
  • 可定制性强,很多命令和定制选项,带来的坏处就是上手相对于asdf会复杂一些。

从实际使用效果看,命令确实不好记,有build install两大命令,每次使用前都需要查看文档才能记起来:( 。

ASDF(Extendable version manager)

asdf是支持安装管理多个版本Ruby,Node.js,Elixir,Erlang(支持安装的语言越来越多,可以通过asdf plugin-list-all查看)版本管理系统。特点:上手容易,支持的语言多,命令简单好记。
最初asdf使用的Erlang插件asdf-erlang是自己维护的插件脚本,后来因为kerl功能齐全且好用,没有必要再重新造相同功能的轮子,所以在2017年12月30号 后依赖于kerl来管理。
同时,如果你以前使用kerl,现在也可以无缝迁移过来,因为它也支持kerl的所有设置(本来依赖的就是kerl)。唯一要做的就是把.kerlrc移到~/.asdf/plugins/erlang/kerl-home/下,目前使用的是此目录下kerl,后续kerl路径应该会改成可配置的。
确定我们只需要使用asdf后,我们重点解决如何设置从又拍云下载源码,解决国内从erlang.org下载速度超级慢的痛点!

  1. 根据before-asdf-install指引安装所需的依赖,比如:build-essential autoconf
  2. 根据asdf-setup安装asdf

    $ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.4.1
    $ echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
    $ echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
  3. 使用asdf装载asdf-erlang插件。

    $ asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
  4. 改造插件:设置从又拍云下载源码。

    $ vim ~/.asdf/plugins/erlang/bin/install
    install_erlang() {
    ensure_kerl_setup
    export MAKEFLAGS="-j$ASDF_CONCURRENCY"
    export ERLANG_DOWNLOAD_URL="http://erlang.b0.upaiyun.com/download"
    $(kerl_path) build "$ASDF_INSTALL_VERSION" "asdf_$ASDF_INSTALL_VERSION"
    $(kerl_path) install "asdf_$ASDF_INSTALL_VERSION" "$ASDF_INSTALL_PATH"
    $(kerl_path) cleanup "$ASDF_INSTALL_VERSION"}

    目的是在install文件install_erlang中指定kerl的下载URL
    export ERLANG_DOWNLOAD_URL="http://erlang.b0.upaiyun.com/download"

  5. 下载构建指定OTP。

    $ asdf install erlang 20.0
    Downloading OTP-20.0.tar.gz to /Users/zhongwen/.asdf/plugins/erlang/kerl-home/archives
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 120 0 120 0 0 101 0 --:--:-- 0:00:01 --:--:-- 101
    100 50.3M 100 50.3M 0 0 1345k 0 0:00:38 0:00:38 --:--:-- 2512k

    可以看到下载速度都在1M以上!!!速度飙升,不过下完后还要等待编译过程,大约要5~10分钟。

  6. 全局设置Erlang版本。

    $ asdf global erlang 20.0
  7. 其它使用命令直接使用命令asdf就可以查看到。

以上基本满足了本地及测试日常开发所需要,但是如果需要在大量生产机器上都批量安装Erlang,通过以上方法则,每台机器都需要重新编译源码,编译一次需要5~10分钟,耗时不讨好。

如何一次编译,到处安装运行?

最直接的方法:

  • 在其中一台机器编译后,写脚本把~/.asdf/installs/erlang/20.0整个打包复制到目标机器;
  • 登录目标机器,解包,执行./Install ,按提示配置应该的变量,比如ERL_ROOT

这是一个安装过程,没有编译所以也是非常快的。类似于使用Erlang Solution下载的二进制编译包,只不过这个编译包是我们自己打包的。
但是,kerl把上面的过程浓缩成了一个命令,不需要你自己写脚本。

$ kerl deploy anotherhost /path/to/install/dir
Cloning Erlang/OTP 20.0 (/path/to/install/dir) to anotherhost (/path/to/install/dir) ...
On anotherhost, you can activate this installation running the following command:
. /path/to/install/dir/activate
Later on, you can leave the installation typing:
kerl_deactivate

额外

  • 如果你想在Shell中像Elixir一样方便的查找文档,那么可以使用kerl install-docsh
  • 在shell中查看使用的环境变量有那些:system_information:environment().
  • Cross compile means using one type of system to compile the Erlang runtime system for a different type of system。典型的应用就是通过X86的Linux为嵌入式系统构建Erlang/OTP。

参考资源

失败并不可耻,低级的目标才是可耻的。伟大的努力中,即使失败也是光荣的。–李小龙