美文网首页
Elixir-自定义 Mix 任务

Elixir-自定义 Mix 任务

作者: 你期待的花开 | 来源:发表于2018-11-14 17:36 被阅读33次

    简介

    通过增加自定义 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.
    ...
    

    相关文章

      网友评论

          本文标题:Elixir-自定义 Mix 任务

          本文链接:https://www.haomeiwen.com/subject/gwaemftx.html