This project is (initially) generated by eliom-distillery
as the basic
project %%%PROJECT_NAME%%%
.
Note that external dependencies are required prior to building the
project. Postgres is mandatory. By default, NPM is used for
automatically installing various NPM packages; you can disable this
via the USE_NPM
variable in Makefile.options
if you prefer to use
a system-wide NPM installation. SASS is optional, but not installing
it may negatively impact the rendering of the pages generated. All
needed packages (Postgres, NPM, SASS, ...) and required OPAM packages can be
installed via the command (from the %%%PROJECT_NAME%%% directory):
opam install .
If you have issues with the NPM provided by your distribution, you can
use NVM. If NPM is too old (< 2.0),
you can try updating it with sudo npm install -g npm
. Depending on your
setup, you may have to update your $PATH
for the new npm
to become
visible.
First create a local database:
make db-init
make db-create
make db-schema
Then compile and run the app, either as a library loaded dynamically into ocsigenserver using a configuration file:
make test.byte (or test.opt)
or as an OCaml executable, using ocsigenserver as a libary (without configuration file):
make test.static.byte (or test.static.opt)
Then connect to http://localhost:8080
to see the running app skeleton.
Registration will work only if sendmail if configured on your system.
But the default template will print the activation link on the standard
output to make it possible for you to create your first users (remove this!).
See below for other useful targets for make.
The following files in this directory have been generated by
eliom-distillery
:
-
%%%PROJECT_NAME%%%*.eliom[i]
Initial source file of the project. All Eliom files (*.eliom, *.eliomi) in this directory are automatically compiled and included in the application. To add a .ml/.mli file to your project, append it to the variableSERVER_FILES
orCLIENT_FILES
in Makefile.options. -
static/
. This folder contains the static data for your app. The content will be copied into the static file directory of the server and included in the mobile app. Put your CSS or additional JavaScript files here. -
Makefile.options
Configure your project here. -
%%%PROJECT_NAME%%%.conf.in
. This file is a template for the configuration file for Ocsigen Server. You will rarely have to edit it yourself - it takes its variables from the Makefile.options. This way, the installation rules and the configuration files are synchronized with respect to the different folders. -
mobile
The files needed by Cordova mobile apps -
Makefile
This contains all rules necessary to build, test, and run your Eliom application. See below for the relevant targets. -
README.md
Here's some help on how to work with this basic distillery project:
- Initialize, start, create, stop, delete a local db, or show status:
make db-init
make db-start
make db-create
make db-stop
make db-delete
make db-status
- Test your application by compiling it and running ocsigenserver locally with a configuration file:
make test.byte (or test.opt)
- Test your application by compiling it as an OCaml executable without configuration file:
make test.static.byte (or test.static.opt)
- Compile it only
make all (or byte or opt)
- Deploy your project on your system
make install (or install.byte or install.opt)
- Run the server on the deployed project
make run.byte (or run.opt)
- Run the static executable of the deployed project
make run.static
If you want to use a global install, update PREFIX in Makefile.options
and run make install
as root. If OCaml/Eliom is not installed
globally, you will need to re-export some environment variables to make
this work:
sudo PATH=$PATH OCAMLPATH=$OCAMLPATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH make run.opt
- If you need a findlib package in your project, add it to the
variables
SERVER_PACKAGES
and/orCLIENT_PACKAGES
. The configuration file will be automatically updated.
Make sure you have a working NPM installation. The needed NPM packages (like Cordova) will be installed automatically.
Warning: NPM packages (and especially Cordova plugins) are very sensitive to
version changes. You may have to change version numbers in
mobile/config.xml.in
if something goes wrong during app generation.
You may also have problems with old versions of gradle
or wrong versions
of Android packages ...
If npm is causing a lot of errors (on Debian) in the following parts of the installation, an advice would be to uninstall nodejs and npm and do a clean installation of them with aptitude.
This installation was tested with those versions:
npm : 6.14.12
nodejs : v10.24.1
Be prepared! You're entering an unstable world!
-
Install JDK 11 (
openjdk-11-jdk
package in Debian/Ubuntu)Run those commands and look carefully if the checked option for java and javac are from the same repository:
sudo update-alternatives --config java sudo update-alternatives --config javac
-
Install Gradle (
gradle
package in Debian/Ubuntu) -
Download and untar the Android SDK (the smaller version without Android Studio is sufficent), rename it so that you have a
$HOME/android-sdk-linux/tools
folder. -
Using the Android package management interface (or sdkmanager):
- List All System Images Available for Download:
sdkmanager --list | grep system-images
(As an example we're going to choose "system-images;android-26;default;x86" but you can choose your way.) - Download Image: sdkmanager --install "system-images;android-26;default;x86"
(Be aware that version > android-26 may not work.)
- List All System Images Available for Download:
If you want to emulate an Android device, you need to create an emulator :
echo "no" | avdmanager --verbose create avd --force --name "generic_10" --package "system-images;android-26 default;x86" --tag "default" --abi "x86"
# Check every available options that offers avdmanager to customize your emulator as you wish.
There is a couple more steps to follow:
Unfortunately there are two named emulator binary file, which are located under $ANDROID_SDK/tools/emulator
and the other is under $ANDROID_SDK/emulator/
.
Make sure you have the right emulator configure (you need to add $ANDROID_SDK/emulator
to your env PATH).
In order to do this:
- Add in your
~/.bashrc
(or~/.zshrc
) file:export ANDROID_SDK=$HOME'your_path_to_android_sdk' export PATH=$ANDROID_SDK/emulator:$PATH export PATH=$ANDROID_SDK/tools:$PATH export PATH=$ANDROID_SDK/tools/bin:$PATH export PATH=$ANDROID_SDK/platform-tools:$PATH export ANDROID_SDK_ROOT=$ANDROID_SDK export ANDROID_AVD_HOME=$HOME/.android/and alias emulator='$ANDROID_SDK/emulator/emulator'
- Then execute this command in your shell:
source ~/.bash_profile
- And show the installed emulators with:
emulator -list-avds
You should have something displaying like:generic_10 # Or even something like : Pixel_2_API_29 Pixel_3a_API_29 Pixel_C_API_29
-
Xcode installs all dependencies you need.
-
Some iOS-specific code exists. You should check it out. For instance, looking carefully at the
PROJECT_NAME.conf.in
file is mandatory if you're building an iOS app.
Ocsigen Start uses cordova-hot-code-push-plugin to upload local files (like CSS and JavaScript files, images and logo) when the server code changes.
Unfortunately, this plugin is not yet available for Windows Phone. However, as ocsigen Start also builds the website part, an idea is to run the website into a WebView on Windows Phones.
Even if Cordova allows you to build Windows app, it doesn't authorize you to load an external URL without interaction with the user.
Another solution is to build an Hosted Web App. It makes it possible to create easily an application based on your website. You can also use Windows JavaScript API (no OCaml binding available for the moment) to get access to native components. You can create the APPX package (package format for Windows app) by using Manifold JS, even if you are on MacOS X or Linux.
If you are on Windows, you can use Visual Studio Community. The Visual Studio Community solution is recommended to test and debug. You can see all errors in the JavaScript console provided in Visual Studio.
Here a complete tutorial from the Windows blog for both versions (with Manifold JS and Visual Studio).
If you use the Manifold JS solution, you need to sign the APPX before installing it on a device.
The following examples are described for Android but they are also available
for iOS: you only need to replace android
by ios
.
- Launch an Ocsigen server serving your app:
make test.opt
In the following commands, if APP_REMOTE
is yes
, the mobile app will
be created by getting all the necessary files (js, etc) from a server.
This may be used to create a mobile app for an which has not been
compiled locally. With APP_REMOTE=no
, the local files will be used.
The remote server address is given in the variable APP_SERVER
.
Replace ${YOUR_SERVER}
by ${YOUR_IP_ADDRESS}:8080
in the following
commands if you want to test on your local machine.
- To run the application in the emulator, use:
make APP_SERVER=http://${YOUR_SERVER} APP_REMOTE=no APP=dev emulate-android
The above command will attempt to launch your app in the Android emulator that you have configured previously. Depending on your setup, you may need to start the emulator before running the command.
Note: If the emulator does not start on your Linux system because of
a library problem, you can try to set the environment variable
ANDROID_EMULATOR_USE_SYSTEM_LIBS
to 1
to make it start (see
https://developer.android.com/studio/command-line/variables.html for
details).
To run the application on a connected device, use:
make APP_SERVER=http://${YOUR_SERVER} APP_REMOTE=no APP=dev run-android
Notice that the APP_SERVER
argument needs to point to your LAN or public
address (e.g., 192.168.1.x
), not to 127.0.0.1
(neither to localhost
). The
reason is that the address will be used by the Android emulator/device, inside
which 127.0.0.1
has different meaning; it points to the Android host itself.
If you only want to build the mobile application, you can use:
make APP_SERVER=http://${YOUR_SERVER} APP_REMOTE=no APP=dev android
Before uploading on Google Play Store, check the variables in Makefile.options (MOBILE_APP_IP, version number, etc). You'll need to build a release version (default is debug version):
make APP_SERVER=http://${YOUR_SERVER} APP_REMOTE=no android-release
then sign it (see Android documentation).
If you want the application URL to include a path
(http://${YOUR_SERVER}${PATH}
),
you need to provide an additional APP_PATH
argument, e.g.,
APP_PATH=/foo
. You need to include the leading /
, but no trailing
/
. You also need to modify the %%%PROJECT_NAME%%%.conf.in
with a
<site>
tag.
Note: if any of the mobile-related targets fails due to the inexistent
node
command, you may need to create a symlink from node
to
nodejs
, e.g., as follows:
ln -s /usr/bin/nodejs /usr/local/bin/node
The mobile app is updated automatically at launch time, every time the server has been updated. To do that, Ocsigen Start is using Cordova Hot Code Push.
In order to make it work, you MUST use the following command every time you update the server:
make APP_SERVER=http://${YOUR_SERVER} APP_REMOTE={yes|no} chcp
You need to define APP_REMOTE
and APP_SERVER
each time you want to build
the mobile application or to update it. The APP
variable is not mandatory per
say but when set to dev
it enables cleartext traffic, so you might want to
keep it on while working on dev builds.
If you don't want to pass the variables App
, APP_SERVER
and
APP_REMOTE
every time, you can change the values of these variables in
Makefile.local.example
and rename this file to Makefile.local
. This way,
the variables App
, APP_REMOTE
and APP_SERVER
are not mandatory when you build
or update the mobile application. You can use:
make chcp
make run-android
make run-ios
...
This file is meant for rules and variables that are only relevant for local development and it must not be deployed or shared (by default, this file is ignored by Git).