【发布时间】:2019-10-28 05:36:51
【问题描述】:
我正在使用 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 参数。
在 elixir 中复制它会相对容易:
#! /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,因此需要 another 空子句,更不用说如果用户提供第一个参数(例如 compile),理论上它可能会中断使用。此外,它限制了项目命名空间,并且不会提供对例如的访问权限。 MixProject,这引出了一个问题,如果这个 python 主义是一个死胡同。我怎样才能最好地做到这一点?
【问题讨论】:
-
我想我在这里遗漏了一些东西。你为什么不直接使用
escript my-cli?我的意思是你每次都需要重建 escript 吗? -
如果我正在处理这个项目,是的,因为 escript 是一个必须重新编译的已编译二进制文件。
标签: elixir command-line-interface