Эргономично работающий escript codepath из источника - PullRequest
0 голосов
/ 06 марта 2019

Я пишу приложение CLI в эликсире с escript.Запуск этого процесса состоит из двух этапов:

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 в качестве точки входа с аргументами CLI, используемыми в argv.

Воспроизвести это в 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 и, следовательно, потребует другое пустое предложение, а неупомянуть, что это может теоретически прерваться в использовании, если пользователь предоставит первый аргумент, такой как compile.Кроме того, он ограничивает пространство имен проекта и не обеспечивает доступа, например, к MixProject, что вызывает вопрос, является ли этот python-ism тупиком.Как мне лучше всего это сделать?

...