Controlling plugin task execution order in Nikola

Published Thu 20 December 2018 in personal

by Bryan Weber

When writing a plugin for Nikola, it may be useful to have a task that has to run another task. For instance, you may want to be able to link to specific points on other pages, which requires parsing those pages before the posts are rendered in the render_posts task. If you’re developing both tasks, this is fairly simple with the task_dep parameter for the doit task engine. However, if the task that must run later is already built in to Nikola, you can’t set its task_dep list.

Never fear though, there is a way out of this problem. The Nikola BasePlugin has a method to inject_dependency to a task. The signature of the function is

inject_dependency(self, target, dependency)

The target is the task where the dependency should be added, and the dependency is the task the target should depend on. This method can be called in the set_site method that sets up your plugin. For example, something like

from nikola.plugin_categories import Task

class MyTask(Task):

    name = 'my_task'

    def set_site(self, site):
        self.site = site

        self.inject_dependency('render_posts', 'my_task')

        super(self, MyTask).set_site(site)

    def gen_tasks(self):
        pass

Here, the MyTask task was added as a dependency to the render_posts task. Note that the name of the task my_task is used in the inject_dependency function. Now, Nikola will run the plugin named my_task before it runs the built-in render_posts plugin.