elixir mix 简介
概述
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 简介的更多相关文章
- elixir mix开发入门
备注: 简单使用mix 进行项目的生成,同时添加docker 构建支持 1. 生成项目 mix new mydemoproject 输出信息如下: * creating README.md * cre ...
- laravel5.4+vue+element简单搭建(gulp+laravel Elixir)(转)
如今laravel来到5.4版本,更方便引入vue了,具体步骤如下: 下图为我动到的文件 1.下载laravel5.4 2.命令行(laravel5.4目录下):composer install 3. ...
- SpaceVim 语言模块 elixir
原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属快捷键 交互式编程 运行当前脚本 模块简介 这一模块为 ...
- laravel+vue结合使用
SegmentFault 首页 问答 专栏 讲堂 圈子 发现 搜索 立即登录免费注册 在 SegmentFault,学习技能.解决问题 每个月,我们帮助 1000 万的开发者解决各种各样的技术 ...
- Cannot find module 'laravel-elixir'问题解决方法
在用gulp 安装elixir的时候报了这样的错误: Laravel elixir npm error Cannot find module 'laravel-elixir/ingredients/c ...
- Elixir 简介
概述 Elixir 是一种基于 Erlang 虚拟机的函数式,面向并行的通用语言, 它是一门通用语言,所以不仅可以用在擅长的高可用,高并发场景下,也可以用在 web 开发等场景下. Erlang 诞生 ...
- elixir 使用mix umbrella 模块化项目
备注: 项目比较大, 模块比较多,一般使用mix 的方式是大家进行文件夹的划分,但是使用mix 的umbrella 可能会更方便 1. 安装 默认安装elixir 的时候已经包含了这个功能 2. 基本 ...
- elixir 高可用系列(二) GenServer
概述 如果我们需要管理多个进程,那么,就需要一个专门的 server 来集中监控和控制这些进程的状态,启停等. OTP 平台中的 GenServer 就是对这个 server 通用部分的抽象. 利用 ...
- Browsersync 简介 and 使用
简介 省时的浏览器同步测试工具,Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面. 曾经我们每改一次的代码,都需要手动去刷新一次 ...
随机推荐
- Perl检查引用类型
有时候可能会需要检查引用是什么类型的,免得我们期待是一个数组引用,却给了一个hash引用. ref函数可以用来检查引用的类型,并返回类型.perl中内置了如下几种引用类型,如果检查的不是引用,则返回u ...
- Multi-Model多模数据库引擎设计与实现
如今,随着业务“互联网化”和“智能化”的发展以及架构 “微服务”和“云化”的发展,应用系统对数据的存储管理提出了新的标准和要求,数据的多样性成为了数据库平台面临的一大挑战,数据库领域也催生了一种新的主 ...
- Keras入门(一)搭建深度神经网络(DNN)解决多分类问题
Keras介绍 Keras是一个开源的高层神经网络API,由纯Python编写而成,其后端可以基于Tensorflow.Theano.MXNet以及CNTK.Keras 为支持快速实验而生,能够把 ...
- [转]Mysql FROM_UNIXTIME as UTC
本文转自:https://stackoverflow.com/questions/18276768/mysql-from-unixtime-as-utc You would be better off ...
- 结构型---享元模式(Flyweight Pattern)
引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严 ...
- asp .net core Get raw request.
小弟初来乍到,分享一些工作学习中遇到的问题和解决方式,如有不准确或是有错误的地方,希望不吝赐教,谢过了. --Dogtwo 背景: 一个代理服务器BK,接收前端A发送的请求,记录log,并转发给 ...
- C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】
最近在看书,看到了对象在内存中的存储方式. 讲到了对象存储在内存堆中,分配的空间除了类型对象的成员所需的内存量,还有额外的成员(类型对象指针. 同步块索引 ),看到这个我就有点不懂了,不知道类型对象指 ...
- 用GitHub Issue取代多说,是不是很厉害?
摘要: 别了,多说,拥抱Gitment. 2017年6月1日,多说正式下线,这多少让人感觉有些遗憾.在比较了多个博客评论系统,我最终选择了Gitment作为本站的博客评论系统: UI简洁,适合我的博客 ...
- 洛谷P1792 [国家集训队]种树(链表 贪心)
题意 题目链接 Sol 最直观的做法是wqs二分+dp.然而还有一种神仙贪心做法. 不难想到我们可以按权值从大到小依次贪心,把左右两边的打上标记,但这显然是错的比如\(1\ 231\ 233\ 232 ...
- Dynamics 365 Online-Virtual Entities
转载来源https://blogs.technet.microsoft.com/lystavlen/2017/09/08/virtual-entities/,使用当前Dynamics 365环境,亲测 ...