OCaml On Ice is a web framework in the style of Ruby on Rails, built on top of Opium. It is designed for building REST APIs, espeically ones that are consumed by BuckleScript or js_of_ocaml frontends. Documentation is here, in particular see the tutorial and design philosophy.
Currently (2020-5-5) building a project with it and reworking parts as I go. I plan to release a stableish version with good docs in a few weeks, but if you're feeling brave it should be usable in the mean time (the tutorial should be fairly up to date).
Ice isn't on OPAM yet as it relies on the master version of Opium. You can install it with git clone [email protected]:roddyyaga/ocoi.git && cd ocoi && opam install .
. It also depends on PostgreSQL and inotify-tools.
To check the install worked:
$ ocoi version
-
Command-line tool (
ocoi
):- Code generation from record types
- Database schemas and queries
- Controllers
- Project scaffolding
- Development server that watches source code
- Code generation from record types
-
Library (
Ocoi
):- Controller modules
- Authentication
- Middleware
- Logging
- Enabling CORS
- MVCish Rails-inspired project structure
- But designed from the beginning for web apps with a REST API backend/modern (compiled-to)-JS framework frontend architecture
- (rather than rendering pages server-side with templates)
- Where relevant, code should be shareable with frontends written in OCaml (or ReasonML)
- Database code generation rather than an ORM (for now at least)
After successfully installing Ice, executing these commands with a running Postgres instance on localhost:5432
with password 12345
gives an API that exposes CRUD functionality (Create Read Update Delete and Index) for the specified todo type on localhost:3000/todos
.
# Create a new project
ocoi new todo &&
cd todo &&
# Create a model
echo "type t = {id: int; title: string; completed: bool} [@@deriving yojson]" > app/models/todo.ml &&
# Generate code for the model
ocoi generate scaffold app/models/todo.ml &&
# Create the DB table for the model
ocoi db migrate todo &&
# Create routes for the model's controller
sed -i 's!|> hello_world!|> Ocoi.Controllers.register_crud "/todos" (module Controllers.Todo.Crud)!g' app/main.ml &&
# Start the server
ocoi server