.github | ||
cmd/gojekyll | ||
collection | ||
config | ||
filters | ||
frontmatter | ||
helpers | ||
pages | ||
pipelines | ||
plugins | ||
scripts | ||
server | ||
site | ||
tags | ||
templates | ||
testdata/example | ||
.appveyor.yml | ||
.gitignore | ||
.travis.yml | ||
CONTRIBUTING.md | ||
LICENSE | ||
Makefile | ||
README.md | ||
version.go |
Gojekyll
Gojekyll is a re-implementation of the Jekyll static site generator, in the Go programming language.
Installation
First-time install:
- Install go. On macOS running Homebrew,
brew install go
is easier than the linked instructions. go get osteele/gojekyll/cmd/gojekyll
- To use the
{% highlight %}
tag, you need Pygments.pip install Pygments
.
Update to the latest version:
go get -u github.com/osteele/liquid github.com/osteele/gojekyll/cmd/gojekyll
Usage
gojekyll build # builds the site in the current directory into _site
gojekyll serve # serve the app at http://localhost:4000
gojekyll help
gojekyll help build
Current Limitations
Missing features:
- Themes
- Excerpts
- Pagination
- Math
- Plugins (except
jekyll-avatar
andjekyll-gist
) site-static_files
,site.html_files
, andsite.tags
- CSV and JSON data files
- Jekyll liquid filters:
group_by_exp
,cgi_escape
,uri_escape
,scssify
, andsmartify
For more detailed status:
- The feature parity board board lists differences between Jekyll and gojekyll in more detail.
- The plugin board lists the implementation status of common plugins. (Gojekyll lacks an extensible plugin mechanism. The goal is to be able to use it to build Jekyll sites that use the most popular plugins.)
- The Go Liquid feature parity board to see differences between the real Liquid library and the one that is used in gojekyll.
Other Differences
These will probably not change.
serve
generates pages on the fly; it doesn't write to the file system.- Files are cached to
/tmp/gojekyll-${USER}
, not./.sass-cache
- Server live reload is always on.
- The server reloads the
_config.yml
too. - An extensible plugin mechanism: support for plugins that aren't compiled into the executable.
- Incremental build isn't planned. The emphasis is on optimizing the non-incremental case.
Timings
[go]jekyll -s jekyll/docs build
on a late-2015 MacBook Pro, running current versions of everything as of 2017-07-01.
Executable | Options | Time |
---|---|---|
jekyll | 18.53s | |
gojekyll | single-threaded; cold cache | 3.31s ± 0.07s |
gojekyll | single-threaded; warm cache | 2.50s ± 0.04s |
gojekyll | multi-threaded | 1.51s ± 0.01s |
gojekyll | multi-threaded | 0.80s ± 0.09s |
This isn't an apples-to-ranges comparison. Gojekyll doesn't use all the plugins that Jekyll does. In particular, jekyll-mentions
parses each page's HTML. This could slow Gojekyll down once it's added.
There's currently no way to disable the cache. It was disabled off by re-building the executable.
The cache is for calls to Pygments (via the highlight
tag). For another site, SASS is greater overhead. This is another candidate for caching, but with multi-threading it may not matter.
Feature Status
- Content
- Front Matter
- Posts
- Categories
- Tags
- Drafts
- Future
- Related
- Static Files
- Variables
- Collections
- Data Files
- CSV
- JSON
- YAML
- Assets
- Coffeescript
- Sass/SCSS
- Customization
- Templates
- Jekyll filters
group_by_exp
pop
shift
cgi_escape
uri_escape
scssify
smartify
- everything else
- Jekyll tags
include
include_relative
link
post_url
highlight
- Jekyll filters
- Includes
include
parametersinclude
variables (e.g.{% include {{ expr }} %}
)
- Permalinks
- Pagination
- Plugins
jekyll-avatar
jekyll-coffeescript
jekyll-gist
(ignoresnoscript: false
)jekyll-live-reload
(always on)jekyll-paginate
- Themes
- Layouts
- Templates
- Server
- Directory watch
- Commands
build
--source
,--destination
,--drafts
,--future
,--unpublished
--config
,--baseurl
,--lsi
,--watch
, etc.- not planned:
--force-polling
,--limit-posts
,--incremental
,JEKYLL_ENV=production
clean
doctor
help
import
new
new-theme
serve
--open-uri
--detach
,--host
,--port
,--baseurl
- not planned:
--incremental
,--ssl
-*
- Windows
Contributing
Bug reports, test cases, and code contributions are more than welcome. Please refer to the contribution guidelines.
Credits
Gojekyll uses these libraries:
Package | Author(s) | Description | License |
---|---|---|---|
github.com/jaschaephraim/lrserver | Jascha Ephraim | Live Reload server | MIT |
github.com/osteele/liquid | yours truly | Liquid processor | MIT |
github.com/pkg/browser | pkg | The serve -o option to open the site in the browser |
BSD 2-clause "Simplified" License |
github.com/russross/blackfriday | Russ Ross | Markdown processor | Simplified BSD License |
github.com/sass/libsass | Listed here | C port of the Ruby SASS compiler | MIT |
github.com/wellington/go-libsass | Drew Wells | Go bindings for libsass | ??? |
gopkg.in/alecthomas/kingpin.v2 | Alec Thomas | command line and flag parser | MIT |
gopkg.in/yaml.v2 | Canonical | YAML support | Apache License 2.0 |
In addition to being totally and obviously inspired by Jekyll, Jekyll's documentation was solid and indispensible. Many of the filter test cases are taken directly from the Jekyll documentation, and during development the Jekyll docs were always open in at least one tab.
The text for gojekyll help
was taken from the output of jekyll help
.
The gopher image in the testdata
directory is from Wikimedia Commons. It is used under the Creative Commons Attribution-Share Alike 3.0 Unported license.
Related
Hugo is the pre-eminent Go static site generator. It isn't Jekyll-compatible (-), but it's extraordinarily polished, performant, and productized (+++).
Liquid is a Go implementation of Liquid templates. I wrote it for gojekyll, but it's implemented as a standalone library.
Jekyll, of course.
License
MIT