mmmrrr

mmmrrr

Escript with EEx or release with cli arguments

I’m building a CLI application to automate different reporting things.

Now others found about this software and also want to use it, so using iex -S mix and calling the functions directly is no longer an option :smiley:

I tried using escript (which looks like what I want), but it complains, that the module EEx is not found.

Also I wondered if I can somehow use mix release because I don’t want to force anyone to install the erlang runtime (since that sounds like a support nightmare): So is there a way to configure a release in a way that it produces a “command line application” that is not started, but instead accepts arguments, does it’s thing and then terminates?

Marked As Solved

ityonemo

ityonemo

I am in a similar situation and have been thinking about this, your post got me to actually get off my butt and try it. Make a blank project. I called mine “test” then I changed Test.hello/1 to IO.puts :world instead of return :world Then mix release, and do _build/dev/rel/test/bin/test eval "Testy.hello" And it does exactly what you expect!

If you’re on linux and you really wanted to be sophisticated about delivery you could put it into a podman container or something and roll it into a single binary, but if you don’t need to roll up a single container (or don’t have the luxury of being in linux) it should be pretty easy to roll up a shell script that will do roll up parameters into the right thing using a release.

Don’t forget to add EEx to your list of :extra_applications in Mix.exs if it needs to be there at runtime. Though I feel like it’s generally better to make it so all of your EEx code runs at compile time, if that’s possible for what you’re doing.

Also Liked

mmmrrr

mmmrrr

Thank you so much for your answer! I’m terribly sorry that it took me so long to write this.

The solution for my first problem was to add EEx to my :extra_applications. Possibly I could use EEx at compile time, I simply have no clue how in this case. I’ll try that :smiley:

Running the application with eval is an interesting approach, even though it does not allow for passing arguments on the command line, correct?

ityonemo

ityonemo

Some of the EEx functions are intended to be run at compile time (for example function_from_file/5). To use this, call EEx.function_from_file(…) inside of defmodule, but outside of a def.

I haven’t tried this, but knowing how Elixir cares about consistency, I’d bet that eval will respect System.argv/0,1. I would be very surprised if it didn’t.

Where Next?

Popular in Questions Top

marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lists...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
nobody
How to bind a phoenix app to a specific ip address? could not find anything about that, nowhere, unfortunately, but for me this is quite...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> somethi...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

Other popular topics Top

9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New

Latest on Elixir Forum

We're in Beta

About us Mission Statement