Эргономичный запуск пути к коду escript из исходного кода

#elixir #command-line-interface

#elixir #интерфейс командной строки

Вопрос:

Я пишу CLI-приложение в elixir с 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-изм тупиковым. Как мне лучше всего это сделать?

Комментарии:

1. Думаю, я здесь чего-то не хватает. Почему бы вам просто не использовать escript my-cli ? Я имею в виду, нужно ли каждый раз перестраивать escript?

2. Если я нахожусь в середине работы над проектом, то да, поскольку escript представляет собой скомпилированный двоичный файл, который пришлось бы скомпилировать заново.

Ответ №1:

Есть ли причина, по которой вы не можете просто объединить два шага?

 mix escript.build amp;amp; ./my-cli
  

Затем нажимайте up enter каждый раз для сборки и запуска? Или создайте простой сценарий оболочки, называемый чем-то простым, например «run», если вы не хотите полагаться на историю своей оболочки?