diff options
author | Loïc Hoguin <[email protected]> | 2017-10-03 13:39:41 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2017-10-03 13:39:41 +0200 |
commit | b5d4cb91f80c833795a2d87050c3674bb7aecdc5 (patch) | |
tree | 62bf0ad8326006fcd3407fcb7c34c844c0dc0874 /articles/erlang.mk-and-relx/index.html | |
parent | 1f8d51dd2692fc3978080419987bbe4d49a41a90 (diff) | |
download | ninenines.eu-b5d4cb91f80c833795a2d87050c3674bb7aecdc5.tar.gz ninenines.eu-b5d4cb91f80c833795a2d87050c3674bb7aecdc5.tar.bz2 ninenines.eu-b5d4cb91f80c833795a2d87050c3674bb7aecdc5.zip |
Update Hugo, docs
Diffstat (limited to 'articles/erlang.mk-and-relx/index.html')
-rw-r--r-- | articles/erlang.mk-and-relx/index.html | 304 |
1 files changed, 190 insertions, 114 deletions
diff --git a/articles/erlang.mk-and-relx/index.html b/articles/erlang.mk-and-relx/index.html index 359a30e6..28bdc7a5 100644 --- a/articles/erlang.mk-and-relx/index.html +++ b/articles/erlang.mk-and-relx/index.html @@ -7,7 +7,7 @@ <meta name="description" content=""> <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara"> - <meta name="generator" content="Hugo 0.17" /> + <meta name="generator" content="Hugo 0.26" /> <title>Nine Nines: Build Erlang releases with Erlang.mk and Relx</title> @@ -74,94 +74,118 @@ </p> </header> -<div class="paragraph"><p>Building OTP releases has always been a difficult task. Tools like
-Reltool or Rebar have made this simpler, but
-it’s no panacea. This article will show you an alternative and
-hopefully much simpler solution.</p></div>
-<div class="paragraph"><p>There is two steps to building a release. First you need to build
-the various OTP applications you want to include in the release. Once
-done, you need to create the release itself, by including the Erlang
-runtime system alongside the applications, a boot script to start the
-node and all its applications, and some configuration files.</p></div>
-<div class="paragraph"><p><a href="https://github.com/extend/erlang.mk">Erlang.mk</a> solves
-the first step. It is an include file for GNU Make. Just
-including it in a Makefile is enough to allow building your project,
-fetching and building dependencies, building documentation, performing
-static analysis and more.</p></div>
-<div class="paragraph"><p><a href="https://github.com/erlware/relx">Relx</a> solves the second
-step. It is a release creation tool, wrapped into a single executable
-file. It doesn’t require a configuration file. And if you do need one,
-it will be a pretty small one.</p></div>
-<div class="paragraph"><p>Let’s take a look at the smallest Erlang.mk powered
-Makefile. There is only one thing required: defining the project
-name.</p></div>
-<div class="listingblock">
-<div class="content"></div></div>
-<div class="paragraph"><p>Simply doing this allows you to build your application by typing
-<code>make</code>, running tests using <code>make tests</code>, and
-more. It will even compile your <em>.dtl</em> files found in the
-<em>templates/</em> directory if you are using ErlyDTL!</p></div>
-<div class="paragraph"><p>Let’s now take a look at a simplified version of the Makefile for
-this website. I only removed a few targets that were off-topic.</p></div>
-<div class="listingblock">
-<div class="content"></div></div>
-<div class="paragraph"><p>You can see here how to define dependencies. First you list all
-the dependency names, then you have one line per dependency, giving
-the repository URL and the commit number, tag or branch you want.</p></div>
-<div class="paragraph"><p>Then you can see two targets defined, with <code>release</code>
-becoming the default target, because it was defined first. You can
-override the default target <code>all</code>, which builds the
-application and its dependencies, this way.</p></div>
-<div class="paragraph"><p>And as you can see, the <code>release</code> target uses
-Relx to build a release into the <em>rel/ninenines/</em>
-directory. Let’s take a look at the configuration file for this release.</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt>{<span style="color: #FF6600">release</span>, {<span style="color: #FF6600">ninenines</span>, <span style="color: #FF0000">"1"</span>}, [<span style="color: #FF6600">ninenines</span>]}<span style="color: #990000">.</span>
-
-{<span style="color: #FF6600">extended_start_script</span>, <span style="color: #000080">true</span>}<span style="color: #990000">.</span>
-{<span style="color: #FF6600">sys_config</span>, <span style="color: #FF0000">"rel/sys.config"</span>}<span style="color: #990000">.</span>
-
-{<span style="color: #FF6600">overlay</span>, [
- {<span style="color: #FF6600">mkdir</span>, <span style="color: #FF0000">"log"</span>},
- {<span style="color: #FF6600">copy</span>, <span style="color: #FF0000">"rel/vm.args"</span>,
- <span style="color: #FF0000">"releases/\{\{release_name\}\}-\{\{release_version\}\}/vm.args"</span>}
-]}<span style="color: #990000">.</span></tt></pre></div></div>
-<div class="paragraph"><p>The first line defines a release named <code>ninenines</code>, which
-has a version number <code>"1"</code> and includes one application, also
-named <code>ninenines</code>, although it doesn’t have to.</p></div>
-<div class="paragraph"><p>We then use the <code>extended_start_script</code> option to tell
-Relx that we would like to have a start script that allows
-us to not only start the release, but do so with the node in the
-background, or also to allow us to connect to a running node, and so on.
-This start script has the same features as the one tools like
-Rebar generates.</p></div>
-<div class="paragraph"><p>The rest of the file just makes sure our configuration files are
-where we expect them. Relx will automatically take care
-of your <em>sys.config</em> file as long as you tell it where to
-find it. The <em>vm.args</em> file used by the extended start script
-needs to be handled more explicitly by using an overlay however.</p></div>
-<div class="paragraph"><p>How does Relx find what applications to include?
-By looking at the application dependencies in the <em>.app</em>
-file of each OTP application. Make sure you put all dependencies in
-there, <em>including</em> library applications, and Relx
-will find everything for you.</p></div>
-<div class="paragraph"><p>For example, this release includes the following applications.
-Only what’s strictly required.</p></div>
-<div class="listingblock">
-<div class="content">
-<pre><code>compiler-4.9.1 crypto-2.3 kernel-2.16.1 ranch-0.8.3 syntax_tools-1.6.11
-cowboy-0.8.5 erlydtl-0.7.0 ninenines-0.2.0 stdlib-1.19.1</code></pre>
-</div></div>
-<div class="paragraph"><p>The <em>sys.config</em> file is standard and
-<a href="http://www.erlang.org/doc/man/config.html">well documented</a>.
-The <em>vm.args</em> file is just an optionally multiline file
-containing all the flags to pass to the Erlang VM, for example
-<code>-name [email protected] -heart</code>.</p></div>
-<div class="paragraph"><p>Building OTP releases has always been a difficult task. Until now.</p></div>
+<div class="paragraph"><p>Building OTP releases has always been a difficult task. Tools like +Reltool or Rebar have made this simpler, but +it’s no panacea. This article will show you an alternative and +hopefully much simpler solution.</p></div> +<div class="paragraph"><p>There is two steps to building a release. First you need to build +the various OTP applications you want to include in the release. Once +done, you need to create the release itself, by including the Erlang +runtime system alongside the applications, a boot script to start the +node and all its applications, and some configuration files.</p></div> +<div class="paragraph"><p><a href="https://github.com/extend/erlang.mk">Erlang.mk</a> solves +the first step. It is an include file for GNU Make. Just +including it in a Makefile is enough to allow building your project, +fetching and building dependencies, building documentation, performing +static analysis and more.</p></div> +<div class="paragraph"><p><a href="https://github.com/erlware/relx">Relx</a> solves the second +step. It is a release creation tool, wrapped into a single executable +file. It doesn’t require a configuration file. And if you do need one, +it will be a pretty small one.</p></div> +<div class="paragraph"><p>Let’s take a look at the smallest Erlang.mk powered +Makefile. There is only one thing required: defining the project +name.</p></div> +<div class="listingblock"> +<div class="content"><!-- Generator: GNU source-highlight 3.1.8 +by Lorenzo Bettini +http://www.lorenzobettini.it +http://www.gnu.org/software/src-highlite --> +<pre><tt><span style="color: #009900">PROJECT =</span> my_project + +include erlang.mk</tt></pre></div></div> +<div class="paragraph"><p>Simply doing this allows you to build your application by typing +<code>make</code>, running tests using <code>make tests</code>, and +more. It will even compile your <em>.dtl</em> files found in the +<em>templates/</em> directory if you are using ErlyDTL!</p></div> +<div class="paragraph"><p>Let’s now take a look at a simplified version of the Makefile for +this website. I only removed a few targets that were off-topic.</p></div> +<div class="listingblock"> +<div class="content"><!-- Generator: GNU source-highlight 3.1.8 +by Lorenzo Bettini +http://www.lorenzobettini.it +http://www.gnu.org/software/src-highlite --> +<pre><tt><span style="color: #009900">PROJECT =</span> ninenines + +<span style="color: #009900">DEPS =</span> cowboy erlydtl +<span style="color: #009900">dep_cowboy_commit =</span> 0.8.5 +<span style="color: #009900">dep_erlydtl_commit =</span> 4d0dc8fb + +<span style="font-weight: bold"><span style="color: #000080">.PHONY:</span></span> release clean-release + +<span style="color: #990000">release:</span> clean-release all projects + relx -o rel<span style="color: #990000">/</span><span style="color: #009900">$(PROJECT)</span> + +<span style="color: #990000">clean-release:</span> clean-projects + rm -rf rel<span style="color: #990000">/</span><span style="color: #009900">$(PROJECT)</span> + +include erlang.mk</tt></pre></div></div> +<div class="paragraph"><p>You can see here how to define dependencies. First you list all +the dependency names, then you have one line per dependency, giving +the repository URL and the commit number, tag or branch you want.</p></div> +<div class="paragraph"><p>Then you can see two targets defined, with <code>release</code> +becoming the default target, because it was defined first. You can +override the default target <code>all</code>, which builds the +application and its dependencies, this way.</p></div> +<div class="paragraph"><p>And as you can see, the <code>release</code> target uses +Relx to build a release into the <em>rel/ninenines/</em> +directory. Let’s take a look at the configuration file for this release.</p></div> +<div class="listingblock"> +<div class="content"><!-- Generator: GNU source-highlight 3.1.8 +by Lorenzo Bettini +http://www.lorenzobettini.it +http://www.gnu.org/software/src-highlite --> +<pre><tt>{<span style="color: #FF6600">release</span>, {<span style="color: #FF6600">ninenines</span>, <span style="color: #FF0000">"1"</span>}, [<span style="color: #FF6600">ninenines</span>]}<span style="color: #990000">.</span> + +{<span style="color: #FF6600">extended_start_script</span>, <span style="color: #000080">true</span>}<span style="color: #990000">.</span> +{<span style="color: #FF6600">sys_config</span>, <span style="color: #FF0000">"rel/sys.config"</span>}<span style="color: #990000">.</span> + +{<span style="color: #FF6600">overlay</span>, [ + {<span style="color: #FF6600">mkdir</span>, <span style="color: #FF0000">"log"</span>}, + {<span style="color: #FF6600">copy</span>, <span style="color: #FF0000">"rel/vm.args"</span>, + <span style="color: #FF0000">"releases/\{\{release_name\}\}-\{\{release_version\}\}/vm.args"</span>} +]}<span style="color: #990000">.</span></tt></pre></div></div> +<div class="paragraph"><p>The first line defines a release named <code>ninenines</code>, which +has a version number <code>"1"</code> and includes one application, also +named <code>ninenines</code>, although it doesn’t have to.</p></div> +<div class="paragraph"><p>We then use the <code>extended_start_script</code> option to tell +Relx that we would like to have a start script that allows +us to not only start the release, but do so with the node in the +background, or also to allow us to connect to a running node, and so on. +This start script has the same features as the one tools like +Rebar generates.</p></div> +<div class="paragraph"><p>The rest of the file just makes sure our configuration files are +where we expect them. Relx will automatically take care +of your <em>sys.config</em> file as long as you tell it where to +find it. The <em>vm.args</em> file used by the extended start script +needs to be handled more explicitly by using an overlay however.</p></div> +<div class="paragraph"><p>How does Relx find what applications to include? +By looking at the application dependencies in the <em>.app</em> +file of each OTP application. Make sure you put all dependencies in +there, <em>including</em> library applications, and Relx +will find everything for you.</p></div> +<div class="paragraph"><p>For example, this release includes the following applications. +Only what’s strictly required.</p></div> +<div class="listingblock"> +<div class="content"> +<pre><code>compiler-4.9.1 crypto-2.3 kernel-2.16.1 ranch-0.8.3 syntax_tools-1.6.11 +cowboy-0.8.5 erlydtl-0.7.0 ninenines-0.2.0 stdlib-1.19.1</code></pre> +</div></div> +<div class="paragraph"><p>The <em>sys.config</em> file is standard and +<a href="http://www.erlang.org/doc/man/config.html">well documented</a>. +The <em>vm.args</em> file is just an optionally multiline file +containing all the flags to pass to the Erlang VM, for example +<code>-name [email protected] -heart</code>.</p></div> +<div class="paragraph"><p>Building OTP releases has always been a difficult task. Until now.</p></div> </article> </div> @@ -170,55 +194,107 @@ containing all the flags to pass to the Erlang VM, for example <h3>More articles</h3> <ul id="articles-nav" class="extra_margin"> - <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.2/">Cowboy 2.0 release candidate 2</a></li> + + <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.2/">Cowboy 2.0 release candidate 2</a></li> + + + + <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.1/">Cowboy 2.0 release candidate 1</a></li> + - <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.1/">Cowboy 2.0 release candidate 1</a></li> + + <li><a href="https://ninenines.eu/articles/the-elephant-in-the-room/">The elephant in the room</a></li> + - <li><a href="https://ninenines.eu/articles/the-elephant-in-the-room/">The elephant in the room</a></li> + + <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don't let it crash</a></li> + - <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don't let it crash</a></li> + + <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li> + - <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li> + + <li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li> + - <li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li> + + <li><a href="https://ninenines.eu/articles/ml-archives/">Mailing list archived</a></li> + - <li><a href="https://ninenines.eu/articles/ml-archives/">Mailing list archived</a></li> + + <li><a href="https://ninenines.eu/articles/website-update/">Website update</a></li> + - <li><a href="https://ninenines.eu/articles/website-update/">Website update</a></li> + + <li><a href="https://ninenines.eu/articles/erlanger-playbook-september-2015-update/">The Erlanger Playbook September 2015 Update</a></li> + - <li><a href="https://ninenines.eu/articles/erlanger-playbook-september-2015-update/">The Erlanger Playbook September 2015 Update</a></li> + + <li><a href="https://ninenines.eu/articles/erlanger-playbook/">The Erlanger Playbook</a></li> + - <li><a href="https://ninenines.eu/articles/erlanger-playbook/">The Erlanger Playbook</a></li> + + <li><a href="https://ninenines.eu/articles/erlang-validate-utf8/">Validating UTF-8 binaries with Erlang</a></li> + - <li><a href="https://ninenines.eu/articles/erlang-validate-utf8/">Validating UTF-8 binaries with Erlang</a></li> + + <li><a href="https://ninenines.eu/articles/on-open-source/">On open source</a></li> + - <li><a href="https://ninenines.eu/articles/on-open-source/">On open source</a></li> + + <li><a href="https://ninenines.eu/articles/the-story-so-far/">The story so far</a></li> + - <li><a href="https://ninenines.eu/articles/the-story-so-far/">The story so far</a></li> + + <li><a href="https://ninenines.eu/articles/cowboy2-qs/">Cowboy 2.0 and query strings</a></li> + - <li><a href="https://ninenines.eu/articles/cowboy2-qs/">Cowboy 2.0 and query strings</a></li> + + <li><a href="https://ninenines.eu/articles/january-2014-status/">January 2014 status</a></li> + - <li><a href="https://ninenines.eu/articles/january-2014-status/">January 2014 status</a></li> + + <li><a href="https://ninenines.eu/articles/farwest-funded/">Farwest got funded!</a></li> + - <li><a href="https://ninenines.eu/articles/farwest-funded/">Farwest got funded!</a></li> + + <li><a href="https://ninenines.eu/articles/erlang.mk-and-relx/">Build Erlang releases with Erlang.mk and Relx</a></li> + - <li><a href="https://ninenines.eu/articles/erlang.mk-and-relx/">Build Erlang releases with Erlang.mk and Relx</a></li> + + <li><a href="https://ninenines.eu/articles/xerl-0.5-intermediate-module/">Xerl: intermediate module</a></li> + - <li><a href="https://ninenines.eu/articles/xerl-0.5-intermediate-module/">Xerl: intermediate module</a></li> + + <li><a href="https://ninenines.eu/articles/xerl-0.4-expression-separator/">Xerl: expression separator</a></li> + - <li><a href="https://ninenines.eu/articles/xerl-0.4-expression-separator/">Xerl: expression separator</a></li> + + <li><a href="https://ninenines.eu/articles/erlang-scalability/">Erlang Scalability</a></li> + - <li><a href="https://ninenines.eu/articles/erlang-scalability/">Erlang Scalability</a></li> + + <li><a href="https://ninenines.eu/articles/xerl-0.3-atomic-expressions/">Xerl: atomic expressions</a></li> + - <li><a href="https://ninenines.eu/articles/xerl-0.3-atomic-expressions/">Xerl: atomic expressions</a></li> + + <li><a href="https://ninenines.eu/articles/xerl-0.2-two-modules/">Xerl: two modules</a></li> + - <li><a href="https://ninenines.eu/articles/xerl-0.2-two-modules/">Xerl: two modules</a></li> + + <li><a href="https://ninenines.eu/articles/xerl-0.1-empty-modules/">Xerl: empty modules</a></li> + - <li><a href="https://ninenines.eu/articles/xerl-0.1-empty-modules/">Xerl: empty modules</a></li> + + <li><a href="https://ninenines.eu/articles/ranch-ftp/">Build an FTP Server with Ranch in 30 Minutes</a></li> + - <li><a href="https://ninenines.eu/articles/ranch-ftp/">Build an FTP Server with Ranch in 30 Minutes</a></li> + + <li><a href="https://ninenines.eu/articles/tictactoe/">Erlang Tic Tac Toe</a></li> + - <li><a href="https://ninenines.eu/articles/tictactoe/">Erlang Tic Tac Toe</a></li> + </ul> |