esy
package.json workflow for native development with Reason/OCaml

This README serves as a development documentation for esy. For user
documentation refer to esy.sh documentation site.
Repository structure
The following snippet lists esy repository structured (omitting irrelevant or
obvious items) with further explanations:
βββ CHANGELOG.md
βββ LICENSE
βββ README.md
β
βββ Makefile
β Common tasks and workflows for esy development.
β
βββ bin/esy
β symlink (wrapper on Windows) for esy command, used for running tests
β
βββ bin/esyInstallRelease.js
β postinstall step for npm releases produced with `esy npm-release`
β command. This is a built JS file which is developed in a separate flow
β inside `esy-install-npm-release/` subdirectory (see below).
β
βββ docs
β esy end user documentation in markdown format.
β
βββ dune
βββ dune-project
β
βββ esy
β This dune library implements sandbox builder - a routine which builds
β the entire dependency graph and provides other introspection APIs.
β
βββ esy/bin
β This dune executable implements "esy" command.
β
βββ esy-solve
β This dune library implements solver.
β
βββ esy-install
β This dune library implements installer.
β
βββ esy-build-package
β This dune library implements package builder. esy library uses this to
β build each package.
β
βββ esy-build-package/bin
β This dune executable implements "esy-build-package" command.
β
βββ esy-installer
β Implementation of installation procedure defined with *.install files.
β This re-implements opam-installer.
β
βββ esy-install-npm-release
β Sources for `bin/esyInstallRelease.js`.
β
βββ esy-command-expression
β Parser for #{...} syntax used in esy manifests.
β
βββ esy-shell-expansion
β A simple shell expansion.
β
βββ esy-yarn-lockfile
β Parser for a subset of yarn lockfile format.
β
βββ esy-lib
β A collection of utility modules shared between other libraries.
β
βββ site
β Sources for https://esy.sh
β
βββ esy.lock
βββ package.json
β
βββ scripts
β
βββ test
β Unit tests.
β
βββ test-e2e-slow
β End-to-end test suite which takes a significant amount of time.
β We execute it on CI by placing `@slowtest` token in commit messages.
β
βββ test-e2e
End-to-end test suite.
Workflow
To make changes to esy and test them locally:
% git clone --recurse-submodules git://github.com/esy/esy.git
% cd esy # Change to the cloned directory
% esy # install and build dependencies
And then run newly built esy executable from anywhere by adding PATH_TO_REPO/_build/install/default/bin
to the $PATH during the shell's session. On Windows, append PATH_TO_REPO/bin too.
Updating bin/esyInstallRelease.js
bin/esyInstallRelease.js is developed separately within the esy-install-npm-release/ directory.
Run:
% make bin/esyInstallRelease.js
to update the bin/esyInstallRelease.js file with the latest changed, don't
forget to commit it.
Running Tests
Run:
% make test
Slow tests
By placing @slowtest token in commit messages, we mark the commit ready for the slow tests framework
(tests that hit the network). They are run with node test-e2e-slow/run-slow-tests.js
Windows
In cases e2e tests fail with Host key verification failed., you might have to create ssh keys
in the cygwin shall and add them to your github profile.
- Enter cygwin installed by esy (not the global one)
.\node_modules\esy-bash\re\_build\default\bin\EsyBash.exe bash
ssh-keygen
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa
Branches
There are two branches:
master β the active development, we cut new versions out of there regularly.
0.0.x β maintainance branch for 0.0.x releases.
0.2.x β maintainance branch for 0.2.x releases.
0.3.x β maintainance branch for 0.3.x releases.
Workflow for esy.sh
To make changes to esy.sh:
- Bootstrap site's dev environment:
% make site-bootstrap
% make site-start
- When you are happy with the changes:
% make site-publish
Issues
Issues are tracked at esy/esy.
Publishing Releases
esy is released on npm.
Because esy is written in OCaml/Reason and compiled into a native executable we
need to acquire a set of prebuilt binaries for each supported platform (Windows,
macOS and Linux). We employ CI servers (thanks Azure) to build platform specific
releases.
The release workflow is the following:
-
Ensure you are on master branch and assuming you want to release the
version currently defined in package.json (see step 6.), run
% make release-tag
% git push && git push --tags
-
Wait till CI finishes its task and release @esy-nightly/esy package.
You can test it manually.
-
Run
% make release-prepare
which downloads the nightly corresponding to the current commit working
directory is at and "promotes" it to a release. It will create
_release/package directory.
-
Ensure release inside _release/package directory is ok.
You can cd _release/package && npm pack && npm install -g ./esy-*.tgz to test how
release installs and feels.
-
Run
% make release-publish
to upload the release on npm.
Use
% make NPM_RELEASE_TAG=next release-publish
to publish the release under next tag (so users won't get it automatically but
only explicitly requested).
-
Bump version in package.json to the next patch version.
We expect the next version to be mostly a patch version. In case you
want to release new minor or major version you need to bump it before the
release.