# nf-core/blog : pipeline refactoring
---
With the ongoing migration to nf-test, our goal is to enhance the modularity and self-containment of each component in nf-core pipelines, including modules, sub-workflows, and workflows.
**Key Enhancements:**
* **Parallel Testing**: Implementing one test per file to facilitate parallelisation.
* **Strict Tag Provenance**: Ensuring rigorous tag provenance from modules to subworkflows and then to workflows. This approach aids in more targeted and efficient testing when code changes.
* **Dedicated Folders**: Assigning a specific folder for each main script, irrespective of whether they are modules, subworkflows, or workflows.
* **Unified Script Naming**: All main scripts for modules, subworkflows, and workflows will be named main.nf, residing in their respective folders.
* **Tests Alongside Main Scripts**: Placing tests in their own `tests/` folder alongside the main scripts.
* **Distinct emits**: Designating specific emits for modules, subworkflows, and workflows. This practice ensures clear differentiation of output channels for consistent snapshot creation.
**Structure Example:**
Each module, sub-workflow, and workflow script will be isolated in its folder with a dedicated main.nf:
```tree=
modules/nf-core/tool/subtool/
├── main.nf
├── meta.yml
├── environment.yml
└── tests
├── main.nf.test
└── tags.yml
```
```tree=
subworkflows/
├── local
│ └── tool-1_tool-2
│ ├── main.nf
│ ├── main.nf.test.snap
│ └── tags.yml
└── nf-core
└── tool-1_tool-2_tool-3_tool-4
├── main.nf
├── meta.yml
├── nextflow.config
└── tests
├── main.nf.test
├── main.nf.test.snap
└── tags.yml
```
```tree=
workflows/
├── main.nf
├── nextflow.config
└── tests
├── main.nf.test
├── main.nf.test.snap
├── parameter_1.nf.test
├── parameter_1.nf.test.snap
├── parameter_2.nf.test
├── parameter_2.nf.test.snap
└── tags.yml
```
## Shift from `modules.config` to Individual `nextflow.config`:
### For Modules
With the introduction of DSL2, there is a shift in how we manage process configurations for modules. Previously, configurations and tool options for modules were consolidated in a single `modules.config` file. While this approach was functional, it lacked the granularity and isolation that complex pipelines demand.
To address this, we're migrating these configurations into separate `nextflow.config `files for each module. This change has several key benefits:
* **Enhanced Isolation**: By having individual nextflow.config files for each module, we isolate configurations, reducing the risk of conflicts and increasing clarity.
* **Granularity in Configuration**: Separate config files allow for more detailed and module-specific settings, catering to the unique requirements of each module.
* **Easier Maintenance and Updates**: With configurations being module-specific, updating or maintaining a particular module becomes more straightforward, without the need to sift through a central, monolithic configuration file.
* **Improved Flexibility and Reusability**: Modules with their own nextflow.config can be easily shared and reused across different nf-core pipelines, enhancing flexibility and promoting a modular development approach.
### For Subworkflows/Workflows
For integrating module configurations into sub-workflows, individual nextflow.config files from modules are included in the sub-workflow’s nextflow.config:
```bash=
includeConfig '../../../modules/nf-core/tool-1/subtool/nextflow.config'
includeConfig '../../../modules/nf-core/tool-2/subtool/nextflow.config'
includeConfig '../../../modules/nf-core/tool-3/subtool/nextflow.config'
```
### Considerations
[add any considerations or potential disadvantages of this approach]
---
## new housekeeping nf-core sub-wfs:
* utils_nextflow_pipeline
* utils_nfcore_pipeline
* utils_nfvalidation_plugin
---
## Changes to github CI
---
## test-data params
`params.modules_test_data_base`
`params.pipelines_test_data_base`
---
conda declarations to have `environment.yml`
---
not including versions in the snapshots -> will have bot for bumping the versions
---