从源代码按人机工程学运行escript代码路径

时间:2019-03-06 09:40:38

标签: elixir command-line-interface

我正在用escript在elixir中编写一个CLI应用程序。从源头上运行它是一个两步过程:

mix escript.build
./my-cli

这在开发过程中有点烦人,我宁愿使用一个调用。但是,mix run与我未使用的OTP有关联。同样,仅调用lib/cli.ex不会运行指定的escript入口点,而是编译模块并运行顶层的任何内容。

在python中,解决方案应该是

#!/usr/bin/env python3

import sys

def main(*argv):
  print(argv)

if __name__ == "__main__":
  main(sys.argv[1:])

如果内置的CLI使用main函数作为入口点,并且在argv中使用CLI参数。

在长生不老药中复制它相对容易:

#! /usr/bin/env elixir

defmodule MyCLI do
  def main(args) do
    IO.inspect(args)
  end
end

MyCLI.main(System.argv())

但是,这将在escript.build过程中调用脚本。可以通过在main函数中添加一个子句来缓解这种情况:

def main(["escript.build" | _]) do
end

但这仍然无法捕获例如mix compile,因此需要另一个空子句,更不用说如果用户提供第一个自变量(例如compile),则它在理论上可能会中断使用。另外,它限制了项目名称空间,并且将不提供对例如MixProject,这引出了一个问题,即这种python-ism是否是死胡同。我该怎么做?

1 个答案:

答案 0 :(得分:0)

您为什么不能将两个步骤结合在一起?

mix escript.build && ./my-cli

然后每次点击+输入即可构建并运行?或者,如果您不想依靠自己的shell历史记录,还是创建一个简单的shell脚本,例如“ run”之类的简单脚本?