<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alvaro Cabrera Durán</title>
    <description>The latest articles on DEV Community by Alvaro Cabrera Durán (@pateketrueke).</description>
    <link>https://dev.to/pateketrueke</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F268025%2Fb13de47e-e8e3-47a1-8a44-01fd0f81bebb.jpeg</url>
      <title>DEV Community: Alvaro Cabrera Durán</title>
      <link>https://dev.to/pateketrueke</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pateketrueke"/>
    <language>en</language>
    <item>
      <title>Makefile recipes I</title>
      <dc:creator>Alvaro Cabrera Durán</dc:creator>
      <pubDate>Thu, 03 Sep 2020 21:20:01 +0000</pubDate>
      <link>https://dev.to/pateketrueke/makefile-recipes-i-569h</link>
      <guid>https://dev.to/pateketrueke/makefile-recipes-i-569h</guid>
      <description>&lt;p&gt;I've been playing around Makefiles for a while, and I'm still pleased with the outcome you can achieve as task runner.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These &lt;a href="https://github.com/tacoss/plate/blob/master/Makefile"&gt;Makefile&lt;/a&gt; recipes are being used on my own template for frontend development: &lt;a href="https://github.com/tacoss/plate"&gt;plate&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Current working directory
&lt;/h2&gt;

&lt;p&gt;It's important to know where we are, final paths are relative from here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;shell&lt;/span&gt; &lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="nf"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Defaults
&lt;/h2&gt;

&lt;p&gt;Configuration below is for deployment to GitHub Pages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nv"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;build
&lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;master
&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gh-pages
&lt;span class="nv"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Release: &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;shell&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="nf"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Templates
&lt;/h2&gt;

&lt;p&gt;Path substitution is used to rebase some paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;page:example.md&lt;/code&gt; becomes &lt;code&gt;src/pages/example.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;css:home.less&lt;/code&gt; becomes &lt;code&gt;src/resources/styles/home.less&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js:app.js&lt;/code&gt; becomes &lt;code&gt;src/resources/scripts/app.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app:components:App.svelte&lt;/code&gt; becomes &lt;code&gt;src/app/components/App.svelte&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lib:helpers:api.js&lt;/code&gt; becomes &lt;code&gt;src/lib/helpers/api.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;res:styles:reset.css&lt;/code&gt; becomes &lt;code&gt;src/resources/styles/reset.css&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nv"&gt;_src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;src/&lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;patsubst&lt;/span&gt; js%,resources/scripts%,&lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;patsubst&lt;/span&gt; css%,resources/styles%,&lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;patsubst&lt;/span&gt; res%,resources%,&lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;patsubst&lt;/span&gt; page%,pages%,&lt;span class="nv"&gt;$(NAME)&lt;/span&gt;&lt;span class="nf"&gt;))))&lt;/span&gt;
&lt;span class="nv"&gt;_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;patsubst&lt;/span&gt; %/,%,&lt;span class="nv"&gt;$(_src)&lt;/span&gt;&lt;span class="nf"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;_basedir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt; &lt;span class="nv"&gt;$(_path)&lt;/span&gt;&lt;span class="nf"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Directories
&lt;/h2&gt;

&lt;p&gt;Those paths are used when creating needed directories and file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nv"&gt;dirname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;patsubst&lt;/span&gt; %/,%,&lt;span class="nv"&gt;$(_basedir)&lt;/span&gt;&lt;span class="nf"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;patsubst&lt;/span&gt; &lt;span class="nv"&gt;$(_basedir)&lt;/span&gt;,,&lt;span class="nv"&gt;$(_path)&lt;/span&gt;&lt;span class="nf"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Environment vars
&lt;/h2&gt;

&lt;p&gt;Standard variables for the underlying processes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm getting &lt;code&gt;GIT_REVISION&lt;/code&gt; to render a &lt;code&gt;&amp;lt;meta name="revision" content="ef825dc"&amp;gt;&lt;/code&gt; tag in generated pages.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nv"&gt;GIT_REVISION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;shell&lt;/span&gt; git rev-parse &lt;span class="nt"&gt;--short&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;7 HEAD&lt;span class="nf"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;development

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;NODE_ENV&lt;/span&gt; &lt;span class="nv"&gt;GIT_REVISION&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Targets
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A phony target is one that is not really the name of a file; rather it is just a name for a recipe to be executed when you make an explicit request. There are two reasons to use a phony target: to avoid a conflict with a file of the same name, and to improve performance.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;? add rm dev test deps clean prune dist pages deploy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Utils
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;iif(...)&lt;/code&gt; helper is used to run a command conditionally, its output depends of the returned exit-code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="err"&gt;define&lt;/span&gt; &lt;span class="err"&gt;iif&lt;/span&gt;
  &lt;span class="err"&gt;@(($1&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/dev/null&lt;/span&gt; &lt;span class="err"&gt;2&amp;gt;&amp;amp;1)&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="err"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"\r* $2\n"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"\r* $3\n"&lt;/span&gt;
&lt;span class="err"&gt;endef&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Input
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;BODY&lt;/code&gt; is used for adding files, when empty it'll fallback to &lt;code&gt;STDIN&lt;/code&gt; instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="k"&gt;ifeq&lt;/span&gt; &lt;span class="nv"&gt;($(BODY),)&lt;/span&gt;
&lt;span class="nv"&gt;BODY&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;shell&lt;/span&gt; bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'if test ! -t 0; then cat -; fi'&lt;/span&gt;&lt;span class="nf"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Validation
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;check_defined(...)&lt;/code&gt; helper is used to validate &lt;code&gt;INPUT&lt;/code&gt; when required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nv"&gt;check_defined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;strip&lt;/span&gt; &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;foreach&lt;/span&gt; 1,&lt;span class="nv"&gt;$1&lt;/span&gt;, &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;call&lt;/span&gt; __check_defined,&lt;span class="nv"&gt;$1&lt;/span&gt;,&lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;strip&lt;/span&gt; &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;value&lt;/span&gt; 2&lt;span class="nf"&gt;)))))&lt;/span&gt;
&lt;span class="nv"&gt;__check_defined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="nf"&gt;)&lt;/span&gt;,, &lt;span class="nf"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;error&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt;, e.g. &lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="nf"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Display all targets in this file
&lt;/h2&gt;

&lt;p&gt;If you run &lt;code&gt;make&lt;/code&gt; without arguments this target will be invoked — shows a list of available tasks and usage examples.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;?&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;Makefile&lt;/span&gt;
  &lt;span class="nl"&gt;@awk -F'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;.*?&lt;/span&gt;&lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt;' '/^[a-z&lt;/span&gt;\\&lt;span class="nf"&gt;%!:-]+:.*&lt;/span&gt;&lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt;/{gsub("%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;$$1);gsub("&lt;/span&gt;\\\\&lt;span class="nf"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;":*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;$$1);printf "&lt;/span&gt;\0&lt;span class="nf"&gt;33[36m%8s&lt;/span&gt;\0&lt;span class="nf"&gt;33[0m %s&lt;/span&gt;\n&lt;span class="nf"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;$$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;$$2}' $&amp;lt;&lt;/span&gt;
  &lt;span class="nl"&gt;@printf "\n  Examples&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;"&lt;/span&gt;
  &lt;span class="nl"&gt;@printf "\n    make add&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;page NAME=example.md BODY='&lt;/span&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;span class="nf"&gt; It works!'"&lt;/span&gt;
  &lt;span class="nl"&gt;@printf "\n    make rm&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;Dockerfile"&lt;/span&gt;
  &lt;span class="err"&gt;@printf&lt;/span&gt; &lt;span class="s2"&gt;"\n    make clean dev"&lt;/span&gt;
  &lt;span class="err"&gt;@printf&lt;/span&gt; &lt;span class="s2"&gt;"\n\n"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Adding files to the project
&lt;/h2&gt;

&lt;p&gt;Write new files with &lt;code&gt;make add&lt;/code&gt; — where templates &lt;code&gt;add NAME=js/app.js&lt;/code&gt; and &lt;code&gt;add:js:app.js&lt;/code&gt; are equivalent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;add&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Create files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt; scripts or resources&lt;/span&gt;
  &lt;span class="err"&gt;@$(call&lt;/span&gt; &lt;span class="err"&gt;check_defined,&lt;/span&gt; &lt;span class="err"&gt;NAME,&lt;/span&gt; &lt;span class="err"&gt;Missing&lt;/span&gt; &lt;span class="err"&gt;file&lt;/span&gt; &lt;span class="err"&gt;name)&lt;/span&gt;
  &lt;span class="err"&gt;@$(call&lt;/span&gt; &lt;span class="err"&gt;check_defined,&lt;/span&gt; &lt;span class="err"&gt;BODY,&lt;/span&gt; &lt;span class="err"&gt;Missing&lt;/span&gt; &lt;span class="err"&gt;file&lt;/span&gt; &lt;span class="err"&gt;content)&lt;/span&gt;
  &lt;span class="err"&gt;@mkdir&lt;/span&gt; &lt;span class="err"&gt;-p&lt;/span&gt; &lt;span class="err"&gt;$(PWD)/$(dirname)&lt;/span&gt;
  &lt;span class="err"&gt;@echo&lt;/span&gt; &lt;span class="err"&gt;$(BODY)&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$(PWD)/$(filepath)&lt;/span&gt;
  &lt;span class="err"&gt;@printf&lt;/span&gt; &lt;span class="s2"&gt;"\r* File $(filepath) was created\n"&lt;/span&gt;

&lt;span class="nl"&gt;add\&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;%: &lt;/span&gt;&lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Shortcut for adding files&lt;/span&gt;
  &lt;span class="nl"&gt;@make -s add NAME=$(subst &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;$*)/$(NAME) BODY=$(BODY)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Remove files from the project
&lt;/h2&gt;

&lt;p&gt;Delete existing files with &lt;code&gt;make rm&lt;/code&gt; — where templates &lt;code&gt;rm NAME=css/home.less&lt;/code&gt; and &lt;code&gt;rm:css:home.less&lt;/code&gt; are equivalent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;rm&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Remove **any** stuff from your workspace&lt;/span&gt;
  &lt;span class="err"&gt;@$(call&lt;/span&gt; &lt;span class="err"&gt;check_defined,&lt;/span&gt; &lt;span class="err"&gt;NAME,&lt;/span&gt; &lt;span class="err"&gt;Missing&lt;/span&gt; &lt;span class="err"&gt;file&lt;/span&gt; &lt;span class="err"&gt;name)&lt;/span&gt;
  &lt;span class="err"&gt;@$(call&lt;/span&gt; &lt;span class="err"&gt;iif,rm&lt;/span&gt; &lt;span class="err"&gt;-r&lt;/span&gt; &lt;span class="err"&gt;$(PWD)/$(filepath),File&lt;/span&gt; &lt;span class="err"&gt;$(filepath)&lt;/span&gt; &lt;span class="err"&gt;was&lt;/span&gt; &lt;span class="err"&gt;deleted,Failed&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;delete&lt;/span&gt; &lt;span class="err"&gt;$(filepath))&lt;/span&gt;
  &lt;span class="err"&gt;@$(call&lt;/span&gt; &lt;span class="err"&gt;iif,rmdir&lt;/span&gt; &lt;span class="err"&gt;$(PWD)/$(dirname),Parent&lt;/span&gt; &lt;span class="err"&gt;directory&lt;/span&gt; &lt;span class="err"&gt;clear,Parent&lt;/span&gt; &lt;span class="err"&gt;directory&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;not&lt;/span&gt; &lt;span class="err"&gt;empty...)&lt;/span&gt;

&lt;span class="nl"&gt;rm\&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;%: &lt;/span&gt;&lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Shortcut for removing files&lt;/span&gt;
  &lt;span class="nl"&gt;@make -s rm NAME=$(subst &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;$*)/$(NAME)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Development tasks
&lt;/h2&gt;

&lt;p&gt;Start your development workflow with the &lt;code&gt;make dev&lt;/code&gt; task.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;deps &lt;/span&gt;&lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Start development&lt;/span&gt;
  &lt;span class="err"&gt;@npm&lt;/span&gt; &lt;span class="err"&gt;run&lt;/span&gt; &lt;span class="err"&gt;dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing tasks
&lt;/h2&gt;

&lt;p&gt;Fire your testing workflow with the &lt;code&gt;make test&lt;/code&gt; task.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;deps &lt;/span&gt;&lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Test for syntax issues&lt;/span&gt;
  &lt;span class="err"&gt;@npm&lt;/span&gt; &lt;span class="err"&gt;run&lt;/span&gt; &lt;span class="err"&gt;check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Build task
&lt;/h2&gt;

&lt;p&gt;Run your build workflow with the &lt;code&gt;make dist&lt;/code&gt; task.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;dist&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;deps &lt;/span&gt;&lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Compile sources for production&lt;/span&gt;
  &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production npm run dist &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Check dependencies
&lt;/h2&gt;

&lt;p&gt;Helpful task to validate if &lt;code&gt;node_modules&lt;/code&gt; are already present and ready.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;deps&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Check for installed dependencies&lt;/span&gt;
  &lt;span class="err"&gt;@(((ls&lt;/span&gt; &lt;span class="err"&gt;node_modules&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;grep&lt;/span&gt; &lt;span class="err"&gt;.)&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/dev/null&lt;/span&gt; &lt;span class="err"&gt;2&amp;gt;&amp;amp;1)&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;npm&lt;/span&gt; &lt;span class="err"&gt;i)&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Cleanup
&lt;/h2&gt;

&lt;p&gt;Remove cache files from tooling, also deletes the &lt;code&gt;build&lt;/code&gt; directory.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;.tarima&lt;/code&gt; file is a cached JSON from my tooling.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Remove cache and generated artifacts&lt;/span&gt;
  &lt;span class="err"&gt;@$(call&lt;/span&gt; &lt;span class="err"&gt;iif,rm&lt;/span&gt; &lt;span class="err"&gt;-r&lt;/span&gt; &lt;span class="err"&gt;$(src),Built&lt;/span&gt; &lt;span class="err"&gt;artifacts&lt;/span&gt; &lt;span class="err"&gt;were&lt;/span&gt; &lt;span class="err"&gt;deleted,Artifacts&lt;/span&gt; &lt;span class="err"&gt;already&lt;/span&gt; &lt;span class="err"&gt;deleted)&lt;/span&gt;
  &lt;span class="err"&gt;@$(call&lt;/span&gt; &lt;span class="err"&gt;iif,unlink&lt;/span&gt; &lt;span class="err"&gt;.tarima,Cache&lt;/span&gt; &lt;span class="err"&gt;file&lt;/span&gt; &lt;span class="err"&gt;was&lt;/span&gt; &lt;span class="err"&gt;deleted,Cache&lt;/span&gt; &lt;span class="err"&gt;file&lt;/span&gt; &lt;span class="err"&gt;already&lt;/span&gt; &lt;span class="err"&gt;deleted)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Clean dependencies
&lt;/h2&gt;

&lt;p&gt;Ensure &lt;code&gt;node_modules&lt;/code&gt; are completely removed from your project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;prune&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;clean &lt;/span&gt;&lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Remove all stuff from node_modules/*&lt;/span&gt;
  &lt;span class="err"&gt;@printf&lt;/span&gt; &lt;span class="s2"&gt;"\r* Removing all dependencies... "&lt;/span&gt;
  &lt;span class="err"&gt;@rm&lt;/span&gt; &lt;span class="err"&gt;-rf&lt;/span&gt; &lt;span class="err"&gt;node_modules/.{bin,cache}&lt;/span&gt;
  &lt;span class="err"&gt;@rm&lt;/span&gt; &lt;span class="err"&gt;-rf&lt;/span&gt; &lt;span class="err"&gt;node_modules/*&lt;/span&gt;
  &lt;span class="err"&gt;@echo&lt;/span&gt; &lt;span class="s2"&gt;"OK"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  GitHub Pages branch
&lt;/h2&gt;

&lt;p&gt;In order to push to &lt;code&gt;gh-pages&lt;/code&gt; the branch should exists already.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Fetch or create the target branch&lt;/span&gt;
  &lt;span class="err"&gt;@(git&lt;/span&gt; &lt;span class="err"&gt;fetch&lt;/span&gt; &lt;span class="err"&gt;origin&lt;/span&gt; &lt;span class="err"&gt;$(target)&lt;/span&gt; &lt;span class="err"&gt;2&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/dev/null&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;(\&lt;/span&gt;
    &lt;span class="err"&gt;git&lt;/span&gt; &lt;span class="err"&gt;checkout&lt;/span&gt; &lt;span class="err"&gt;--orphan&lt;/span&gt; &lt;span class="err"&gt;$(target);\&lt;/span&gt;
    &lt;span class="err"&gt;git&lt;/span&gt; &lt;span class="err"&gt;rm&lt;/span&gt; &lt;span class="err"&gt;-rf&lt;/span&gt; &lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/dev/null;\&lt;/span&gt;
    &lt;span class="err"&gt;git&lt;/span&gt; &lt;span class="err"&gt;commit&lt;/span&gt; &lt;span class="err"&gt;--allow-empty&lt;/span&gt; &lt;span class="err"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"initial commit"&lt;/span&gt;&lt;span class="err"&gt;;\&lt;/span&gt;
    &lt;span class="err"&gt;git&lt;/span&gt; &lt;span class="err"&gt;checkout&lt;/span&gt; &lt;span class="err"&gt;$(from)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Deployment to GitHub Pages
&lt;/h2&gt;

&lt;p&gt;Build your files and push &lt;code&gt;gh-pages&lt;/code&gt; changes to master.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;pages &lt;/span&gt;&lt;span class="c"&gt;##&lt;/span&gt;&lt;span class="nf"&gt; Prepare and push changes on target branch&lt;/span&gt;
  &lt;span class="err"&gt;@(mv&lt;/span&gt; &lt;span class="err"&gt;$(src)&lt;/span&gt; &lt;span class="err"&gt;.backup&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/dev/null&lt;/span&gt; &lt;span class="err"&gt;2&amp;gt;&amp;amp;1)&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;true&lt;/span&gt;
  &lt;span class="err"&gt;@(git&lt;/span&gt; &lt;span class="err"&gt;worktree&lt;/span&gt; &lt;span class="err"&gt;remove&lt;/span&gt; &lt;span class="err"&gt;$(src)&lt;/span&gt; &lt;span class="err"&gt;--force&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/dev/null&lt;/span&gt; &lt;span class="err"&gt;2&amp;gt;&amp;amp;1)&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;true&lt;/span&gt;
  &lt;span class="err"&gt;@(git&lt;/span&gt; &lt;span class="err"&gt;worktree&lt;/span&gt; &lt;span class="err"&gt;add&lt;/span&gt; &lt;span class="err"&gt;$(src)&lt;/span&gt; &lt;span class="err"&gt;$(target)&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="err"&gt;(cp&lt;/span&gt; &lt;span class="err"&gt;-r&lt;/span&gt; &lt;span class="err"&gt;.backup/*&lt;/span&gt; &lt;span class="err"&gt;$(src)&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/dev/null&lt;/span&gt; &lt;span class="err"&gt;2&amp;gt;&amp;amp;1))&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;true&lt;/span&gt;
  &lt;span class="err"&gt;@cd&lt;/span&gt; &lt;span class="err"&gt;$(src)&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="err"&gt;git&lt;/span&gt; &lt;span class="err"&gt;add&lt;/span&gt; &lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="err"&gt;git&lt;/span&gt; &lt;span class="err"&gt;commit&lt;/span&gt; &lt;span class="err"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"$(message)"&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;true&lt;/span&gt;
  &lt;span class="err"&gt;@(mv&lt;/span&gt; &lt;span class="err"&gt;.backup&lt;/span&gt; &lt;span class="err"&gt;$(src)&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/dev/null&lt;/span&gt; &lt;span class="err"&gt;2&amp;gt;&amp;amp;1)&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;true&lt;/span&gt;
  &lt;span class="err"&gt;@git&lt;/span&gt; &lt;span class="err"&gt;push&lt;/span&gt; &lt;span class="err"&gt;origin&lt;/span&gt; &lt;span class="err"&gt;$(target)&lt;/span&gt; &lt;span class="err"&gt;-f&lt;/span&gt; &lt;span class="err"&gt;||&lt;/span&gt; &lt;span class="err"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>tooling</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
