我有这个代码:
defmodule Mix.Tasks.Echo do
use Mix.Task
@impl Mix.Task
def run(args) do
IO.puts("running!")
Mix.shell().info(Enum.join(args, " "))
IO.inspect(args, label: "Received args")
end
end
可以这样使用:
$ mix echo foo.bar 123
running!
foo.bar 123
Received args: ["foo.bar", "123"]
如何更改代码,以便我能够通过 并按名称 命名参数访问?
$ mix echo --arg1=123 --my_arg2="fdsafdsafds"
===>
Received args: %{"arg1" => 123, "my_arg2" => "fdsafdsafds"}
?
可以使用任何现有项目中的任何现有任务来检查它是如何完成的。
mix xref
接受参数并用OptionParser
解析它们。
NB elixir-mix 的命名参数的标准格式不是
--foo=bar
,而是 --foo bar
.
mix echo --arg1 123 --my_arg2 "fdsafdsafds"
OptionParser
模块。
defmodule Mix.Tasks.Echo do
use Mix.Task
@impl Mix.Task
def run(args) do
{parsed, _, _} = OptionParser.parse(args, strict: [my_arg1: :string, my_arg2: :boolean])
IO.inspect(parsed, label: "Received args")
end
end
这将为您提供一个关键字列表,这是有道理的,因为它保留了顺序并允许重复参数。如果你真的需要一张地图,你可以从那里使用
Enum.into/1
。您还可以看到它允许类型。