第 01 站 · 前置准备展开探险地图
00装好工具前置准备01起跑线前置准备02进程与信箱R1Elixir 数据流水线可选复习R2读懂 Erlang可选复习03消息与超时04OTP 消息章法05会重启的监督树06给并发设上限07BEAM 节点失联X1两种语言对暗号双语扩展X2双语搭档双语扩展08可靠任务调度器
首页/BEAM 主线/第 01 站
01
地基零基础前置准备BEAMElixirErlang

起跑线

先认识五位伙伴:谁写代码,谁让代码跑,谁提供可靠做法,谁帮你建项目。

2小关卡
约 2 小时 · 建议分 2 次可以分几次
QUESTION · 本站只追这一问

【前置诊断】mix test 失败时,怎样先判断问题属于命令、项目目录、运行时,还是代码?

先看现场

错误发生在不同层

一个同学在没有 mix.exs 的目录运行 mix test,另一个同学遇到 OTP 版本不兼容。他们都以为是代码坏了。先确定故障在哪一层,才知道下一步看哪里。

能够观察到
  • 当前目录是否包含 mix.exs
  • erl、elixir --version 与 mix --version 的输出
  • mix test 的第一条错误,以及项目能否完成编译
为什么学这一站

它要解决什么

这五个名字不用硬背。Erlang 和 Elixir 写代码,BEAM 运行代码,OTP 提供可靠做法,Mix 管理项目。亲手跑一遍,关系就清楚了。

走完这一站

你会做到

  • 能用自己的话说清 Erlang、Elixir、BEAM、OTP 和 Mix 各做什么

  • 能分别打开 erl 和 iex,并让它们运行一小段代码

  • 能从版本信息中找到 Erlang/OTP、Elixir 和 Mix

  • 能用 Mix 创建项目、运行代码并跑通第一项测试

出发前
  • 已走完安装准备,终端能找到 erl、elixir 和 mix
  • 已经完成任意一门语言的 Foundation;如果值、模式、函数或模块还陌生,先回去补基础
同一件事,两种写法

先看做什么,再看怎么写

写法不同,动作相同:创建进程、发送 tuple,再按模式接收。

当前代码
Elixir
# 在 IEx 中
# 记住当前进程,子进程稍后要把消息发回来
parent = self()

# 新建一个轻量进程,并向 parent 发送 tuple
spawn(fn ->
  send(parent, {:hello, :from_elixir})
end)

# 等待并拆开符合形状的消息
receive do
  {:hello, source} -> {:received, source}
end
LAB
动手

检查工具,再建项目

约 15–25 分钟

先查看 Erlang、Elixir 和 Mix 的版本,再让 Mix 创建项目并运行测试。

  1. 01

    先运行 erl,输入 erlang:system_info(otp_release).,请 Erlang 报出 OTP 版本

  2. 02

    运行 elixir --version 和 mix --version,找出 Erlang/OTP、Elixir、Mix 三类版本

  3. 03

    执行 mix new beam_probe,看看 mix.exs、lib/ 和 test/ 分别装着什么

  4. 04

    进入项目运行 mix test,再用 mix run -e 从同一项目读取 OTP release

复制到终端,按回车
# 直接打印 Erlang/OTP 版本,然后退出
erl -noshell -eval 'io:format("OTP ~s~n", [erlang:system_info(otp_release)]), halt().'

# 查看 Elixir 与 Mix 版本
elixir --version
mix --version

# 创建项目,进入目录并运行测试
mix new beam_probe
cd beam_probe
mix test

# 在项目环境中再次读取 OTP 版本
mix run -e 'IO.puts("OTP #{:erlang.system_info(:otp_release)}")'
你会看到
  • 三个命令会报出彼此能够配合工作的 Erlang/OTP、Elixir 和 Mix 版本
  • Mix 会准备 mix.exs、源码目录和测试目录,但不会另外创造一台虚拟机
  • 示例测试能够通过,mix run 也能直接调用 Erlang 的 erlang 模块
故意弄坏

走出 beam_probe 再运行 mix test。先判断它在说“这里没有项目”,还是“代码写错了”。

这次能看清

这台电脑已经能使用 Erlang、Elixir 和 Mix,也能创建、编译和测试一个小项目。

这次还不能说明

这不能保证所有外部包都兼容,也不能说明项目已适合部署。

先认词

这段代码里的关键词

01

BEAM

运行 Erlang 和 Elixir 的虚拟机。它安排小进程轮流工作,也负责投递消息。

02

OTP

一套经过长期使用的工具和做法,用来发现、隔离和恢复错误。Supervisor 与 GenServer 都属于 OTP。

03

Mix

Elixir 的项目工具。它负责创建、编译、格式化、测试和依赖管理;mix.exs 是项目说明书。Mix 不等于 BEAM、OTP 或 Hex。

从代码里认出章法

这里用了哪些设计模式

01

Layered Architecture

把语言、运行时、OTP 与项目工具分层检查,不让错误混在一起。

02

Fail Fast

先验证环境和项目边界,再调试业务代码。

想一想

下面哪句话最准确?OTP 是……

轮到你

写一张编程体检卡

用 12 行以内记录三个版本,再写下三种问题的第一步:命令不存在、缺少 mix.exs、版本不兼容。

提示 1先迈一步

先让 elixir --version、mix --version 和 mix help 分别说出自己的信息。

提示 2再缩小一点

看到错误时,先判断是“找不到工具”“不在项目里”,还是“版本不合适”。

提示 3离答案很近了

把结果保存好,以后请别人帮忙时,这张体检卡会很有用。

提示 4从终点往回想

先挑一条“过关信号”,为它写一个最小测试。如果电脑看不出结果,就把这句话改成一个真正能观察到的现象。

过关条件
  • 体检卡上能看到 OTP、Elixir 和 Mix 三类版本

  • 能说明 mix.exs 是项目说明书,并分清 Mix 与 Hex

  • 三种情况各有一个清楚的下一步

  • 能分清电脑的操作系统进程与 BEAM 小进程

带走

记住三句话

  1. 1

    Erlang 和 Elixir 用来表达想法,BEAM 让代码运行,OTP 提供可靠做法。

  2. 2

    Elixir 调用 Erlang,通常是在同一台 BEAM 虚拟机里直接调用模块,不需要跨网络喊话。

  3. 3

    Mix 管项目和构建任务,Hex 提供软件包;遇到问题时,先看看出错的是哪一位伙伴。

再读一点

去看原版资料

Elixir Getting StartedErlang Getting StartedIntroduction to Mix
本站结束实验做过,答案也想过,就把这一站收好。