概述

mix 是 elixir 工程的构建工具,利用 mix,可以快速方便的创建 elixir 工程,写单元测试,管理 elixir 包的依赖管理等等。

我觉得刚开始学习 elixir 的时候,先简单看看 mix 的用法,也方便学习中写些 elixir 的小例子。

本文环境基于:

$ elixir -v
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Elixir 1.2.1 $ mix -v
Mix 1.2.1

使用 mix 管理 elixir 工程

mix 支持很多子命令,可以通过 mix help 来查看。

下面只介绍一些常用的子命令,使得可以在学习 elixir 的过程中,做些简单的代码实验即可。

创建工程

学习 elixir 的过程中,难免会写些代码来试验语言的特性。

虽然写个 exs 的脚本也行,但是将所有的试验代码通过一个工程来管理,不仅方便以后查看,也方便试验的时候复用代码。

所以,首先要看看如何使用 mix 来创建一个 elixir 工程。

$ mix new sample
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/sample.ex
* creating test
* creating test/test_helper.exs
* creating test/sample_test.exs Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more: cd sample
mix test Run "mix help" for more commands.

通过 new 子命令,即可以创建工程,工程的目录结构如下:

 .
├── README.md # 默认的工程说明文件,可以根据工程添加自己的内容
├── config # 工程中使用的各个package的配置,具体说明可以看 config.exs 中的注释说明
│   └── config.exs
├── lib # 真正实现功能或者试验的代码放在这个文件夹中,默认生成一个空的示例
│   └── sample.ex
├── mix.exs # 整个工程的配置文件,里面包含工程名称,版本,依赖关系等等。mix 工具就是依靠此文件来编译工程的
└── test # 单元测试代码放在此文件夹中,默认生成一个空的测试文件
├── sample_test.exs # 文件名称对应 lib 中的代码文件
└── test_helper.exs # 默认只有一行启动测试的代码,可以根据需要扩充(比如加一些共通的测试前处理,后处理等)

编译,运行工程

工程创建了之后,就可以开始写 elixir 的代码,体验 elixir 的特别之处了。

为了试验 mix 的编译,首先在 lib/sample.ex 中加入一段简单的代码:

defmodule Sample do
def hello do
IO.puts "hello Elixir"
end
end

然后编译工程:

$ mix compile
Compiled lib/sample.ex
Generated sample app
Consolidated List.Chars
Consolidated String.Chars
Consolidated Collectable
Consolidated Enumerable
Consolidated IEx.Info
Consolidated Inspect $ ls -l
total 16
-rw-r--r-- 1 xxxxxx staff 399 2 17 22:08 README.md
drwxr-xr-x 3 xxxxxx staff 102 2 17 22:30 _build
drwxr-xr-x 3 xxxxxx staff 102 2 17 22:08 config
drwxr-xr-x 3 xxxxxx staff 102 2 17 22:29 lib
-rw-r--r-- 1 xxxxxx staff 665 2 17 22:08 mix.exs
drwxr-xr-x 4 xxxxxx staff 136 2 17 22:08 test

编译的结果就在 _build 文件夹中。

运行工程也很简单:

$ iex -S mix
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Interactive Elixir (1.2.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Sample.hello
hello Elixir
:ok

单元测试

单元测试是确保代码质量的重要手段,mix 创建的工程也规定了单元测试的规则。

针对上面的简单代码,我们可以在 test 目录中对应的测试文件 samle_test.exs 中添加测试代码:

defmodule SampleTest do
use ExUnit.Case
doctest Sample test "case01" do
assert :ok == Sample.hello
end test "case02" do
assert :ng == Sample.hello
end
end

运行单元测试非常简单:

$ mix test
hello Elixir
.hello Elixir 1) test case02 (SampleTest)
test/sample_test.exs:9
Assertion with == failed
code: :ng == Sample.hello()
lhs: :ng
rhs: :ok
stacktrace:
test/sample_test.exs:10 Finished in 0.07 seconds (0.07s on load, 0.00s on tests)
2 tests, 1 failure Randomized with seed 537919

从输出的内容中可以看出,case01 成功,case02 失败,与预期的是一致的。

编译二进制文件

上面的示例中,是通过 iex -S mix 来运行工程的,这种方式一般用于运行一个库。

我们也可以将工程编译成一个二进制文件,可以分发到所有安装 OTP 环境的系统中运行。

这时,我们需要一个 main 函数。

修改 lib/sample.ex 中的代码如下:

defmodule Sample do
def main(args \\ []) do
IO.puts "hello "
IO.puts args
end
end

为了编译二进制,设置 mix.exs 如下:

def project do
[app: :sample,
version: "0.0.1",
elixir: "~> 1.2",
escript: escript, # 追加 escript 配置
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps]
end def escript do # 追加 escript 函数,其中设置 main_module
[main_module: Sample]
end

编译二进制:

$ mix escript.build
Compiled lib/sample.ex
Generated sample app
Consolidated List.Chars
Consolidated Collectable
Consolidated String.Chars
Consolidated Enumerable
Consolidated IEx.Info
Consolidated Inspect
Generated escript sample with MIX_ENV=dev $ ls -l
total 4824
-rw-r--r-- 1 xxxxxx staff 399 2 17 22:08 README.md
drwxr-xr-x 4 xxxxxx staff 136 2 17 23:08 _build
drwxr-xr-x 3 xxxxxx staff 102 2 17 22:08 config
drwxr-xr-x 3 xxxxxx staff 102 2 17 23:31 lib
-rw-r--r-- 1 xxxxxx staff 738 2 17 23:28 mix.exs
-rwxr-xr-x 1 xxxxxx staff 2460249 2 17 23:28 sample # 此为二进制文件
drwxr-xr-x 4 xxxxxx staff 136 2 17 23:09 test $ ./sample
hello $ ./sample "Elixir"
hello
Elixir

elixir mix 简介的更多相关文章

  1. elixir mix开发入门

    备注: 简单使用mix 进行项目的生成,同时添加docker 构建支持 1. 生成项目 mix new mydemoproject 输出信息如下: * creating README.md * cre ...

  2. laravel5.4+vue+element简单搭建(gulp+laravel Elixir)(转)

    如今laravel来到5.4版本,更方便引入vue了,具体步骤如下: 下图为我动到的文件 1.下载laravel5.4 2.命令行(laravel5.4目录下):composer install 3. ...

  3. SpaceVim 语言模块 elixir

    原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属快捷键 交互式编程 运行当前脚本 模块简介 这一模块为 ...

  4. laravel+vue结合使用

        SegmentFault 首页 问答 专栏 讲堂 圈子 发现 搜索 立即登录免费注册 在 SegmentFault,学习技能.解决问题 每个月,我们帮助 1000 万的开发者解决各种各样的技术 ...

  5. Cannot find module 'laravel-elixir'问题解决方法

    在用gulp 安装elixir的时候报了这样的错误: Laravel elixir npm error Cannot find module 'laravel-elixir/ingredients/c ...

  6. Elixir 简介

    概述 Elixir 是一种基于 Erlang 虚拟机的函数式,面向并行的通用语言, 它是一门通用语言,所以不仅可以用在擅长的高可用,高并发场景下,也可以用在 web 开发等场景下. Erlang 诞生 ...

  7. elixir 使用mix umbrella 模块化项目

    备注: 项目比较大, 模块比较多,一般使用mix 的方式是大家进行文件夹的划分,但是使用mix 的umbrella 可能会更方便 1. 安装 默认安装elixir 的时候已经包含了这个功能 2. 基本 ...

  8. elixir 高可用系列(二) GenServer

    概述 如果我们需要管理多个进程,那么,就需要一个专门的 server 来集中监控和控制这些进程的状态,启停等. OTP 平台中的 GenServer 就是对这个 server 通用部分的抽象. 利用 ...

  9. Browsersync 简介 and 使用

    简介 省时的浏览器同步测试工具,Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面. 曾经我们每改一次的代码,都需要手动去刷新一次 ...

随机推荐

  1. Go基础系列:数据类型转换(strconv包)

    Go不会对数据进行隐式的类型转换,只能手动去执行转换操作. 简单的转换操作 转换数据类型的方式很简单. valueOfTypeB = typeB(valueOfTypeA) 例如: // 浮点数 a ...

  2. 【转载】PhpStudy修改网站根目录

    phpStudy是一个PHP调试环境的程序集成包.该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的 ...

  3. SqlServer 技术点总结(持续更新)

    本文是用于记录自己平时遇到的一些SQL问题或知识点,以便以后自己查阅,会持续的更新,增加内容.发在博客园也可以和各位博友共同学习交流,如文中记录的有错误之处希望指出,谢谢. 一.用SQL语句调用作业 ...

  4. [android] 显示意图激活另外一个activity

    可以使用跳转的方式类似javaweb来实现界面转换 显示意图就是必须要指定开启组件的具体信息,包名,组件名,组件的class 新建一个类TwoActivity ,继承Activity类,重写onCre ...

  5. 浅谈select for update 和select lock in share mode的区别

    有些情况下为了保证数据逻辑的一致性,需要对SELECT的操作加锁.InnoDB存储引擎对于SELECT语句支持两种一致性的锁定读(locking read)操作. . SELECT …… FOR UP ...

  6. 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待

    在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...

  7. 使用 hashMap和treeMap开启多个摄像头的监控任务

    背景:今天有个需求,传入多个摄像头ID,然后调用接口,开启这些摄像头的监控任务. 方法一: 如果你的摄像头监控任务格式为: {camera_id_list=[{createBy=tjt, camera ...

  8. Java中关于Map的使用(HashMap、ConcurrentHashMap)

    在日常开发中Map可能是Java集合框架中最常用的一个类了,当我们常规使用HashMap时可能会经常看到以下这种代码: Map<Integer, String> hashMap = new ...

  9. 【Spring】17、spring cache 与redis缓存整合

    spring cache,基本能够满足一般应用对缓存的需求,但现实总是很复杂,当你的用户量上去或者性能跟不上,总需要进行扩展,这个时候你或许对其提供的内存缓存不满意了,因为其不支持高可用性,也不具备持 ...

  10. Java8 使用stream实现各种list操作

    利用java8新特性,可以用简洁高效的代码来实现一些数据处理. 定义1个Apple对象: public class Apple { private Integer id; private String ...