【问题标题】:Ergonomically running escript codepath from source从源代码运行符合人体工程学的 escript 代码路径
【发布时间】: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


【解决方案1】:

有什么理由不能将这两个步骤结合起来?

mix escript.build && ./my-cli

然后每次都按 up + enter 来构建和运行?或者,如果您不想依赖 shell 历史记录,或者创建一个简单的 shell 脚本,称为“运行”等简单的东西?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多