#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», если вы не хотите полагаться на историю своей оболочки?