Skip to content

Multi-version documentation

By default, plugin assume multi-version documentation publishing.

Configuration, responsible for versioning:

mkdocs.publish {
    docPath = '$version'  
    rootRedirect = true 
    rootRedirectTo = '$docPath'

    versionTitle = '$docPath'
    versionAliases = []
    generateVersionsFile = true
}

Tip

Usually it is more handy to manually set current doc version and not rely on project version because often documentation for currently released version is updated multiple times after release.

Important

Mkdocs-material suggests mike tool usage for publication. Gradle plugin implements absolutely the same workflow as mike, but much easier customizable (as gradle plugin). Material theme would still be able to show version switcher because plugin generates required versions.json file.

Workflow

Usually you work on documentation for current version only. When new version released - you publish new documentation version and continue evolving it. Old version stays published for the legacy users.

Older version update

When older documentation version needs to be updated switch off redirection index.html generation (so it would not override redirection to the latest version):

mkdocs.publish {
    docPath = '0.9'  
    rootRedirect = false  // site root must still redirect to '1.0' (assume it's already published)
}

Will build (without root index.html):

build/mkdocs/
    /0.9/    - mkdocs site for old version

Also, do not use versionAliases when publishing old version because it may override more recent docs version. Plugin would try to warn you in such cases:

WARNING: Publishing version '1.0' is older then the latest published '1.1' and the following overrides might not be desired: 
    root redirect override to '1.0'
    existing alias 'latest' override
    existing alias '1.x' override

Important

This warning is produced by mkdocsVersionsFile file and only when versions.json file generation is not disabled. This check can't be done under mkdocsBuild because publishing repository is required for validation.

So please, when releasing an old version use mkdocsVersionsFile to see all possible warnings before actual publication.

Publication layouts

You may define whatever layout you want, e.g.:

mkdocs.publish.docPath = 'en/1.0/'  

Here generated site will be published into /en/1.0/ folder (not just version) and index.html generated at the root with correct redirection.

Warning

If you want to use version switcher then you should not use long version paths, because mkdocs-material would look for versions file only at one level up.

Aliases

It is possible to publish version not only into version folder, but also into aliased folders.

Could be useful for:

  • Publishing the latest documentation under latest alias, so users could always reference the latest docs with the same link.
  • Publishing docs for developing version under dev alias, so users could easily find dev docs.
  • Serving the latest (patch) version for some mojor version: e.g. 5.x alias could serve the latest published bugfix.

For example, to add latest alias:

mkdocs.publish {
    docPath = '1.0'  
    rootRedirect = true
    versionAliases = ['latest']
}

Will build:

build/mkdocs/
    /0.9/    
    /latest/
    index.html

Note

Alias folder contains a copy of generated documentation, which means that sitemap links would lead to path of exact version.

If same version is re-published - aliases would be correctly updated too.

It is also possible to redirect root into alias instead of exact version with rootRedirectTo option:

mkdocs.publish {
    versionAliases = ['latest']
    rootRedirectTo = 'latest'
}

Tip

In case of root redirection to alias it is better to enable version switcher to clearly show what version is active now (otherwise it would be not obvious)

Doc version switcher

Version switcher might be enabled in mkdocs.yml exactly as described in docs:

extra:
  version:
    provider: mike

Important

You don't need mike itself!

Important

You will not see switcher under mkdocsServe command, but if you call mkdocsVersionsFile (which would also call mkdocsBuild), and manually open new version it would show switcher with all versions (using generated versions.json)

Mkdocs-material requires only versions.json file stored at docs root. Plugin would automatically generate such file (following mike syntax):

  • Plugin verifies actually existing directories in gh-pages repository and would add them to generated versions file. So if you already have many versions published, just publish new version with enabled versions support and you'll see all of them in the version switcher.
  • Theme folders are detected by using \d+(\..*)? regexp (version folder must start with a number) and it must contain 404.html file.
  • Deeper versions folders are also supported: e.g. if mkdocs.publish.docPath = 'en/1.0/' then `en/1.0' folder would be recognized as version
  • Existing records in versions.json file are preserved for found version folders.
    • You can modify file manually (e.g. to modify version title) and it will not be overridden on next publication
    • You can manually remove version folder in repository and on next publication versions.json would be corrected
  • If aliases used, they would be correctly updated (e.g. latest removed from previous latest version.)

If you do not want to generate versions file:

mkdocs.publish.generateVersionsFile = false

To customize version title (shown in dropdown selection) use:

mkdocs.publish.versionTitle = '1.0 (important fix)'

Incremental versions

There is an alternative way for versions.json file generation for cases when publishing task is not used (e.g. when lightweight ru.vyarus.mkdocs-build plugin used).

The idea is to use existing versions file and add new version into it (in contrast, git based publication could detect removed version folders and remove versions from file accordingly).

Tip

Version aliases would be also correctly processed.

To enable incremental versions generation, specify current versions file location:

mkdocs.publish.existingVersionsFile = 'path/to/actual/versions.json'

You can also use a URL (http, ftp or anything that URL could handle):

mkdocs.publish.existingVersionsFile = 'https://xvik.github.io/gradle-mkdocs-plugin/versions.json'

When file specified, mkdocsBuild would load current file and apply new version there (if required). Updated versions file would be available in target build directory (same as with git publication).

Important

There will not be an error if file not found or due to download error - instead plugin would consider current file as not existing and would create a fresh versions file.

This is useful for the first publication.

Note

When git publication used, incremental versions file, generated by mkdocsBuild would be overridden by versions file, generated by publishing task. If required, it could be disabled with mkdocs.publish.generateVersionsFile = false, but keep in mind that publication mechanism is safer to use.