Hugo version 0.43 introduced Hugo Pipes which process assets e.g. save preprocessed Sass files to CSS files. I finally got round to adding this as part of adapting the Ghostwriter theme I use on my site (a forked Ghostwriter theme by Juraj Bubniak).

Why Hugo Pipes and not Webpack

The theme had a webpack build for the Sass files which could be replaced by Hugo Pipes. This was attractive as it simplified the build process for my static site and removed webpack and a whole load of dependencies I no longer need to worry about keeping up-to-date.

How I added Hugo Pipes

The first step was to move the Sass files to a top level directory called /assets.

The second step was to add this pipeline:

{{ $style := resources.Get "sass/main.scss" | resources.ToCSS | resources.Minify | resources.Fingerprint }}
<link rel="stylesheet" href="{{ $style.Permalink }}">

For organisation, I added the above to a new partial called layouts/partials/styles.html and then included this partial into the header.html partial using partialCached.

{{ partialCached "styles.html" . }}

Why use partialCached?

allows for caching of partials that do not need to be re-rendered on every invocation

After some testing to check it worked, the final step for local development was the happy task of deleting the webpack config and associated files.

In terms of deploying, I use Netlify and there turned out to be one gotcha.

error: failed to transform resource: TOCSS: failed to transform "scss/main.scss" (text/x-scss): this feature is not available in your current Hugo version

The issue per this post from Netlify is due to an older version of an Ubuntu image which was incompatible with the version of Hugo. In order to use Hugo Pipes you need to make sure you are using the new Ubuntu image. If you recently set up a Hugo site on Netlify this new Ubuntu image is the default. My site has been on Netlify for some time so I needed to go into the settings and select the new Ubuntu Xenial build image.

Netlify Ubuntu Image

With that done, I re-deployed and this time the deploy went through and everything worked.