# Configuring the Build Step in YAML
Learn how to configure the build step in a YAML file.
Before you proceed, note that YAML is whitespace sensitive. Please copy and paste the example in a text editor with syntax highlighting (e.g. Notepad++).
_For information on the YAML schema, see the [Microsoft reference guide for Azure Pipelines YAML schema](https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema#task)._
## SpecFlow+LivingDoc custom build step YAML snippet
```yaml
- task: SpecFlowPlus@0
inputs:
#generatorSource: 'FeatureFolder' # Required. Options: FeatureFolder, TestAssembly, FeatureData
#projectFilePath: # Required when generatorSource == FeatureFolder
#testAssemblyFilePath: # Required when generatorSource == TestAssembly
#featureDataJsonFilePath: # Required when generatorSource == FeatureData
#projectName: # Optional
#testExecutionJson: # Optional
#projectLanguage: 'en' # Optional
#workItemPrefix: # Optional
#workItemUrlTemplate: # Optional
#bindingAssemblies: # Optional
#output: # Optional
```
## Arguments
| Argument | Description |
| --------------- | ------------|
| generatorSource | **FeatureFolder**: Generate living documentation from feature files from the file system.
**TestAssembly**: Generate living documentation from a compiled SpecFlow test assembly.
**FeatureData**: Generate living documentation from pre-parsed features stored in a Feature Data JSON file. |
| projectFilePath | The folder containing the feature files. Use the test project root folder if you want to include test execution results.|
| testAssemblyFilePath|Relative or absolute path to the test assembly. Glob patterns are supported e.g.: `MyProject\\**\\MyProject.dll`|
| featureDataJsonFilePath |Relative or absolute path to the feature data JSON. Glob patterns are supported e.g.: `MyProject\\**\\FeatureData.json` |
| projectName|The name of the project visible in the viewer|
|testExecutionJson|The absolute or relative path to the Test Execution JSON files generated by the SpecFlow.Plus.LivingDocPlugin. **Glob patterns are supported only when using relative paths**
**Important:** In order to correctly display the execution results, you **MUST** provide the **Test Project Root folder** and not a subfolder (e.g. not the Features folder) in the **projectFilePath** parameter.|
|projectLanguage | The language used by your Gherkin files. This is optional because in many cases the language can be auto-detected. You can read more about language options [here](Documentation-Languages.md).|
|workItemPrefix| The special prefix for tags used to add a [link](../Viewing/Linking.md) to a work item in Azure DevOps.
For example, setting this to "DEVOPS_WI:" will allow you to tag a feature with `@DEVOPS_WI:1234`, and this tag will be converted to a link to work item 1234 when viewing the feature in LivingDoc. |
|workItemUrlTemplate|The URL template to use to generate the external links. Example: `https://dev.azure.com/fabrikam/FabrikamProj/_workitems/edit/{id}`|
|bindingAssemblies | Path to Binding Assemblies (newline delimited). Glob patters are supported e.g.: `MyProject/**/MyBindings.dll`.
**TestAssembly**: If your bindings are in the same assembly as your feature files, you don't have to specify this.
**FeatureFolder**, **FeatureData**: If your Bindings are in the same Test Assembly as your feature files, enter the path to your Test Assembly. |
|output | Relative (from the working directory) or absolute path to the generated output file.|
## Non-LivingDoc specific parameters
- **enabled:** boolean (not needed when true)
- **continueOnError:** boolean (not needed when false)
- **condition:**
| selection | YAML value |
| ------------------------------------------------------------------ | ------------------- |
| Only when all previous tasks have succeeded | (nothing) |
| Even if a previous task has failed, unless the build was canceled | succeededOrFailed() |
| Even if a previous task has failed, even if the build was canceled | always() |
| Only when a previous task has failed | failed() |
| Custom conditions | (custom condition) |
- **timeoutInMinutes:** Specifies the maximum time, in minutes, that a task is allowed to execute before being canceled by server (zero value indicates an infinite timeout)
## Examples
### FeatureFolder example
```yaml
- task: SpecFlowPlus@0
displayName: 'LivingDoc with FeatureFolder generatorSource'
inputs:
generatorSource: 'FeatureFolder'
projectFilePath: 'BookShop.AcceptanceTests'
projectName: 'testName'
testExecutionJson: 'BookShop.AcceptanceTests/**/TestExecution.json'
projectLanguage: 'en'
workItemPrefix: 'WI'
workItemUrlTemplate: 'https://dev.azure.com/specflow/BookShop/_workitems/edit/{id}'
bindingAssemblies: |
BookShop.AcceptanceTests/**/BookShop.AcceptanceTests.dll
BookShop.AcceptanceTests/**/MyBindings.dll
enabled: false
continueOnError: true
condition: always()
timeoutInMinutes: 10
```
### TestAssembly example
```yaml
- task: SpecFlowPlus@0
displayName: 'LivingDoc with TestAssembly generatorSource'
inputs:
generatorSource: 'TestAssembly'
testAssemblyFilePath: 'BookShop.AcceptanceTests/bin/**/BookShop.AcceptanceTests.dll'
projectName: 'testName'
testExecutionJson: 'BookShop.AcceptanceTests/**/TestExecution.json'
projectLanguage: 'en'
workItemPrefix: 'WI'
workItemUrlTemplate: 'https://dev.azure.com/specflow/BookShop/_workitems/edit/{id}'
bindingAssemblies: 'BookShop.AcceptanceTests/**/MyBindings.dll'
enabled: false
continueOnError: true
condition: always()
timeoutInMinutes: 10
```
### FeatureData example
```yaml
- task: SpecFlowPlus@0
displayName: 'LivingDoc with FeatureData generatorSource'
inputs:
generatorSource: 'FeatureData'
featureDataJsonFilePath: './**/FeatureData.json'
testExecutionJson: 'BookShop.AcceptanceTests/**/TestExecution.json'
workItemPrefix: 'WI'
workItemUrlTemplate: 'https://dev.azure.com/specflow/BookShop/_workitems/edit/{id}'
bindingAssemblies: |
BookShop.AcceptanceTests/**/BookShop.AcceptanceTests.dll
BookShop.AcceptanceTests/**/MyBindings.dll
enabled: false
continueOnError: true
condition: always()
timeoutInMinutes: 10
```
### Example of `output`
Specify output file name as `MyFeatureData.json` and place it in the `LivingDoc` directory. If the directory is not exists, the tool will create it.
```yaml
- task: SpecFlowPlus@0
displayName: 'LivingDoc with custom output'
inputs:
generatorSource: 'FeatureFolder'
projectFilePath: 'BookShop.AcceptanceTests'
projectName: 'testName'
testExecutionJson: 'BookShop.AcceptanceTests/**/TestExecution.json'
projectLanguage: 'en'
workItemPrefix: 'WI'
workItemUrlTemplate: 'https://dev.azure.com/specflow/BookShop/_workitems/edit/{id}'
bindingAssemblies: |
BookShop.AcceptanceTests/**/BookShop.AcceptanceTests.dll
BookShop.AcceptanceTests/**/MyBindings.dll
output: 'LivingDoc/MyFeatureData.json'
enabled: false
continueOnError: true
condition: always()
timeoutInMinutes: 10
```