如何将命名参数传递给混合任务?

问题描述 投票:0回答:2

我有这个代码:

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"}

?

elixir elixir-mix
2个回答
0
投票

可以使用任何现有项目中的任何现有任务来检查它是如何完成的。

E。 G。

mix xref
接受参数并OptionParser
解析它们

NB 的命名参数的标准格式不是

--foo=bar
,而是
--foo bar
.

mix echo --arg1 123 --my_arg2 "fdsafdsafds"

0
投票

我认为您正在搜索

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
。您还可以看到它允许类型。

© www.soinside.com 2019 - 2024. All rights reserved.