我需要为我的项目创建一个等效的main
函数。我需要为项目添加一些依赖项,并使用它们来运行单个函数。我真的不需要一个OTP应用程序,所以我认为这样定义它(有主管和一切)会是一种矫枉过正。
我做了一个测试并将其放入mix.ex
这样的工作
def application do
MyModule.main
[applications: [:logger]]
end
但感觉不自然。有更标准的方法吗?
修改
将其置于application
内仅在第一次由于某种原因编译时才有效。
答案 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示例