Pipelines are classes that implement the IPipeline
interface, though you typically create one by deriving from the abstract Pipeline
class which initializes several defaults for you.
Most pipeline configuration happens in the pipeline’s constructor by editing properties of the base Pipeline
, though you can add whatever extra capabilities or methods you want.
Specifying Dependencies
Two properties can be used to specify dependency data of the pipeline:
Dependencies
is aHashSet<string>
that contains the names of pipelines that the current one depends on. In other words, any pipeline name in theDependencies
collection will be executed before the current pipeline is executed. If the current pipeline is specified as the only executing pipeline (for example, on the command line) then it’s dependencies (and their dependencies) will also be executed.DependencyOf
is aHashSet<string>
that defines pipelines that this pipeline is a dependent of. In other words, it’s the opposite of theDependencies
collection and indicates the current pipeline should be executed before those specified in theDependencyOf
collection. This property is particularly valuable when you’re trying to add behavior before pre-configured pipelines such as in Statiq Web.
Other Settings
In addition to specifying dependencies, other settings can be configured from the pipeline constructor:
Isolated
is abool
that indicates if the pipeline is an isolated pipeline. This means that it will be executed independent of any other pipelines.Deployment
is abool
that indicates if the pipeline is a deployment pipeline and should be executed when using the deployment command.ExecutionPolicy
specifies the particular execution policy the pipeline should use.
Adding Modules
Modules can be added to the pipeline through four ModuleList
properties (which are essentially IList<IModule>
) corresponding to the different pipeline phases:
InputModules
ProcessModules
PostProcessModules
OutputModules
You can either add modules individually (the properties are initialized with an empty list) or create a new ModuleList
and set the property to that. Note that modules are added as instances, so adding a ReadFiles
module to the input phase of a pipeline might look like:
public class Content : Pipeline
{
public Content()
{
InputModules = new ModuleList
{
new ReadFiles("**/*.md")
};
// Other pipeline configuration
}
}
Service Injection
If the pipeline is added by type, any services that were registered with the dependency injection container will be available to the constructor and you can inject them.
Adding Pipelines
You can add pipelines to an engine directly using it's Pipelines
property, but the easiest way to add and manipulate pipelines is through the bootstrapper.
Naming Pipelines
Several mechanisms for adding pipelines infer the pipeline name from the class name if you don't provide an explicit name. If you want to define a different name for a pipeline, you can implement the INamedPipeline
interface which contains a PipelineName
property.