如何在Elixir应用程序中运行单个函数?

时间:2016-01-28 03:16:17

标签: elixir

我需要为我的项目创建一个等效的main函数。我需要为项目添加一些依赖项,并使用它们来运行单个函数。我真的不需要一个OTP应用程序,所以我认为这样定义它(有主管和一切)会是一种矫枉过正。

我做了一个测试并将其放入mix.ex这样的工作

def application do
  MyModule.main

  [applications: [:logger]]
end

但感觉不自然。有更标准的方法吗?

修改

将其置于application内仅在第一次由于某种原因编译时才有效。

3 个答案:

答案 0 :(得分:5)

在mix.exs mod函数中添加application选项:

def application do
  [
    mod: {MyModule, []}, 
    applications: [:logger]]
    ...
  ]
end

然后在该模块中实现Application行为:

defmodule MyModule do
  use Application

  def start(_type, _args) do
    IO.puts "starting"
    # some more stuff
  end
end

我会使用main函数代替您在示例中指定的start函数,因为它是公认的惯例。但是,如果您必须使用main函数,我相信有一种方法可以覆盖它。只需查看Application行为的文档。

答案 1 :(得分:0)

我喜欢Jason的回答,但在回答之前我问了一下松弛并得出了答案:

只需在项目的任何位置创建一个模块(此文件位于lib文件夹中),该模块嵌套在Mix.Tasks

defmodule Mix.Tasks.MyTask do
  def run(args) do
    #Do some stuff once
  end
end

然后在命令行外面运行它,就像这个mix my_task一样。好消息是你可以传递可选的args。

答案 2 :(得分:-1)

你也可以使用escript功能,虽然它也构建了一个独立的脚本,运行" main"。见

http://elixir-lang.org/docs/master/mix/Mix.Tasks.Escript.Build.html

是一个简单的hello world示例

https://github.com/bbense/elixir_cli_talk

幻灯片:http://bbense.github.io/elixir_cli_talk/