第 01 站 · 前置准备展开探险地图
起跑线
先认识五位伙伴:谁写代码,谁让代码跑,谁提供可靠做法,谁帮你建项目。
【前置诊断】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,再按模式接收。
# 在 IEx 中
# 记住当前进程,子进程稍后要把消息发回来
parent = self()
# 新建一个轻量进程,并向 parent 发送 tuple
spawn(fn ->
send(parent, {:hello, :from_elixir})
end)
# 等待并拆开符合形状的消息
receive do
{:hello, source} -> {:received, source}
end检查工具,再建项目
先查看 Erlang、Elixir 和 Mix 的版本,再让 Mix 创建项目并运行测试。
- 01
先运行
erl,输入erlang:system_info(otp_release).,请 Erlang 报出 OTP 版本 - 02
运行
elixir --version和mix --version,找出 Erlang/OTP、Elixir、Mix 三类版本 - 03
执行
mix new beam_probe,看看mix.exs、lib/和test/分别装着什么 - 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,也能创建、编译和测试一个小项目。
这不能保证所有外部包都兼容,也不能说明项目已适合部署。
这段代码里的关键词
BEAM
运行 Erlang 和 Elixir 的虚拟机。它安排小进程轮流工作,也负责投递消息。
OTP
一套经过长期使用的工具和做法,用来发现、隔离和恢复错误。Supervisor 与 GenServer 都属于 OTP。
Mix
Elixir 的项目工具。它负责创建、编译、格式化、测试和依赖管理;mix.exs 是项目说明书。Mix 不等于 BEAM、OTP 或 Hex。
这里用了哪些设计模式
Layered Architecture
把语言、运行时、OTP 与项目工具分层检查,不让错误混在一起。
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
Erlang 和 Elixir 用来表达想法,BEAM 让代码运行,OTP 提供可靠做法。
- 2
Elixir 调用 Erlang,通常是在同一台 BEAM 虚拟机里直接调用模块,不需要跨网络喊话。
- 3
Mix 管项目和构建任务,Hex 提供软件包;遇到问题时,先看看出错的是哪一位伙伴。