我正在用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是否是死胡同。我该怎么做?
答案 0 :(得分:0)
您为什么不能将两个步骤结合在一起?
mix escript.build && ./my-cli
然后每次点击+输入即可构建并运行?或者,如果您不想依靠自己的shell历史记录,还是创建一个简单的shell脚本,例如“ run”之类的简单脚本?