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