I built my blog - and wrote my first post - using Fornax v0.11.0 and had to get a bit creative to copy binary files (the favicon).
This was addressed in 0.12.0 by allowing the core code to output a byte array instead of lines of text (the changes are in this commit: Allow generate to return a byte array).
So how does one take advantage of this?
First thing to do is to update the version of fornax the project uses, I'm using a local installation, so I want to run the following:
dotnet tool update --local fornax
That done you can see what version is installed using
dotnet fornax version (at time of typing 0.13.1)
The next thing is to copy the .dll's to the project. Because nuget packages are cached globally you'll need to go find them - these are in a folder underneath your user:
So on my machine, for this version, I want to copy
C:\Users\james\.nuget\packages\fornax\0.13.1\Fornax.Template\_lib\Markdig.dll to the
_lib folder in the root of my blog.
n.b. in F# 5 scripts will be able to reference packages directly from nuget as follows:
#r "nuget: Newtonsoft.Json" at which point the
_lib folder will be redundant.
At this point I would do a clean and a build or a watch to make sure everything still works as expected and then commit the changes...
Taking out the loader hack
My current implementation abuses a loader to copy binary files, instead we can now make the behaviour more consistent with the load/generate pattern as binary files just become static files.
Start by deleting
loaders as its no longer required.
generators\staticfile.fsx to look like this:
#r "../_lib/Fornax.Core.dll" open System.IO let generate (ctx : SiteContents) (projectRoot: string) (page: string) = let inputPath = Path.Combine(projectRoot, page) File.ReadAllBytes inputPath
All we've done here is change
File.ReadAllBytes but this is the critical fix.
Finally we remove the binary file filters (
ext = ".png" || ext = ".ico") from the
config.fsx so it now looks like:
let staticPredicate (projectRoot: string, page: string) = let ext = Path.GetExtension page not ( page.Contains ".DS_Store" || page.Contains "_public" || page.Contains ".config" || page.Contains "_lib" || page.Contains ".git" || page.Contains ".ionide" || page.Contains ".vs" || ext = ".fsx" )
A clean and a build should now copy binary files intact to the generated output without having to "cheat" by copying them in the loader.
Concerns separated again - much nicer.