Elixir-自定义 Mix 任务

简介

通过增加自定义 Mix 任务来扩展你的 Elixir 项目是很常见需求。在我们学习如何给我们的项目创建特定 Mix 任务之前,让我们看一个已经存在的任务。

$ mix phoenix.new my_phoenix_app

* creating my_phoenix_app/config/config.exs
* creating my_phoenix_app/config/dev.exs
* creating my_phoenix_app/config/prod.exs
* creating my_phoenix_app/config/prod.secret.exs
* creating my_phoenix_app/config/test.exs
* creating my_phoenix_app/lib/my_phoenix_app.ex
* creating my_phoenix_app/lib/my_phoenix_app/endpoint.ex
* creating my_phoenix_app/test/views/error_view_test.exs
...

正如上面我们看到的 shell 命令,Phoenix 有一个自定义的 Mix 任务去生成一个新项目。用 Elixir 创建类似的东西很容易。

起步

首先创建一个基本的 Mix 项目。

$ mix new hello

* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/hello.ex
* creating test
* creating test/test_helper.exs
* creating test/hello_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

cd hello
mix test

Run "mix help" for more commands.

在 Mix 为我们生成的 lib/hello.ex 文件中,创建一个会输出 “Hello, World!” 的函数。

defmodule Hello do
  @doc """
  每次调用都会输出 `Hello, World!`
  """
  def say do
    IO.puts("Hello, World!")
  end
end

自定义 Mix 任务

来创建我们的自定义 Mix 任务吧,新建一个目录以及文件 hello/lib/mix/tasks/hello.ex。

defmodule Mix.Tasks.Hello do
  use Mix.Task

  @shortdoc "Simply runs the Hello.say/0 command."
  def run(_) do
    # 调用我们刚才创建的 Hello.say 函数
    Hello.say()
  end
end

注意我们 defmodule 用Mix.Tasks 开头,后接我们想在命令里执行任务时用的名字。第二行用 use Mix.TaskMix.Task 这个 behaviour 引入当前命名空间。然后定义一个忽略所有参数的 run 函数。在这个函数里调用hello module 里的say 函数。

Mix 任务实战

来看看我们的 Mix 任务。首先保证在命令行中我们处在这个任务能起作用的目录,然后敲 mix hello,我们应该会看到下面的结果:

$ mix hello
Hello, World!

当你打错字, Mix 会用字符串模糊匹配来给你推荐:

$ mix hell
** (Mix) The task "hell" could not be found. Did you mean "hello"?

不知道你有没有注意到我们刚刚用了一个新的模块属性(module attribute)?就是 @shortdoc,这个属性在我们发布应用的时候非常有用,比如一个用户在命令行里敲 mix help 的时候。

$ mix help

mix app.start         # Starts all registered apps
...
mix hello             # Simply calls the Hello.say/0 function.
...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,092评论 19 139
  • 本文章翻译自 https://blog.codeship.com/comparing-elixir-go 译者:关...
    Shawn_xiaoyu阅读 12,885评论 3 26
  • 临时画的,所以没有留绘画过程图。只能口述啦。 1.首先用2B铅笔构图,用圆规画轻轻出圆形。再在里面绘出荷花图...
    小舒颜阅读 4,442评论 0 4
  • 二十多岁的年龄,正好处在一个尴尬的年纪。 看似应有尽有,实际一无所有。 过了个年意味着又大了一岁,可能这也是大学最...
    啊Crazy阅读 4,119评论 0 1
  • I paced alone on the road across the field while the suns...
    Kassie阅读 1,877评论 0 1

友情链接更多精彩内容