I have an erlang project whose state is entirely read only, and composed of ets tables and a compiled module. It takes a few seconds to build the tables when the code starts.
What is the best way to package this so it can be used by other applications?
Some other things to consider:
- There are no data contention issues or changing state, so it seems as if there is no need for a gen_server.
- I like being able to call
application:start/1
and have things "just work". - Some process should own the ets tables. It seems like I should not leave that up to the client code.
The above leads me to think I should create an application, and call the setup code from the supervisor's init/1
function, but I'm unsure if this is a silly way to approach it.
Wrap it up as a standard OTP application.
gen_server
isn't about maintaining state, it's about having a server which can handle requests (it's not calledgen_state
for a reason imho ;)). Create an OTP app and let people use it in the same way they would any other.If the module is entirely static you won't need any processes in such an application. If you implement the
application
behavior in OTP you should be able to connect the ETS tables directly to the main application process (initiate the tables in the applicationstart/2
callback). That way you'll have a minimal process model, allowing you to skip both thesupervisor
and anygen_server
.You should certainly use OTP, but that doesn't mean that you absolutely must have a
supervisor
or agen_server
.Use
appmon
to view the process hierarchy of your application.