257 lines
7.2 KiB
Markdown
257 lines
7.2 KiB
Markdown
|
|
# Drupal Recipe Unpack Plugin
|
||
|
|
|
||
|
|
Thanks for using this Drupal component.
|
||
|
|
|
||
|
|
You can participate in its development on Drupal.org, through our issue system:
|
||
|
|
https://www.drupal.org/project/issues/drupal
|
||
|
|
|
||
|
|
You can get the full Drupal repo here:
|
||
|
|
https://www.drupal.org/project/drupal/git-instructions
|
||
|
|
|
||
|
|
You can browse the full Drupal repo here:
|
||
|
|
https://git.drupalcode.org/project/drupal
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
The Recipe Unpacking system is a Composer plugin that manages "drupal-recipe"
|
||
|
|
packages. Recipes are special Composer packages designed to bootstrap Drupal
|
||
|
|
projects with necessary dependencies. When a recipe is installed, this plugin
|
||
|
|
"unpacks" it by moving the recipe's dependencies directly into your project's
|
||
|
|
root `composer.json`, and removes the recipe as a project dependency.
|
||
|
|
|
||
|
|
## Key Concepts
|
||
|
|
|
||
|
|
### What is a Recipe?
|
||
|
|
|
||
|
|
A recipe is a Composer package with type `drupal-recipe` that contains a curated
|
||
|
|
set of dependencies, configuration and content but no code of its own. Recipes
|
||
|
|
are meant to be "unpacked" and "applied" rather than remain as runtime
|
||
|
|
dependencies.
|
||
|
|
|
||
|
|
### What is Unpacking?
|
||
|
|
|
||
|
|
Unpacking is the process where:
|
||
|
|
|
||
|
|
1. A recipe's dependencies are added to your project's root `composer.json`
|
||
|
|
2. The recipe itself is removed from your dependencies
|
||
|
|
3. The `composer.lock` and vendor installation files are updated accordingly
|
||
|
|
4. The recipe will remain in the project's recipes folder so it can be applied
|
||
|
|
|
||
|
|
## Commands
|
||
|
|
|
||
|
|
### `drupal:recipe-unpack`
|
||
|
|
|
||
|
|
Unpack a recipe package that's already required in your project.
|
||
|
|
|
||
|
|
```bash
|
||
|
|
composer drupal:recipe-unpack drupal/example_recipe
|
||
|
|
```
|
||
|
|
|
||
|
|
Unpack all recipes that are required in your project.
|
||
|
|
|
||
|
|
```bash
|
||
|
|
composer drupal:recipe-unpack
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Options
|
||
|
|
|
||
|
|
This command doesn't take additional options.
|
||
|
|
|
||
|
|
## Automatic Unpacking
|
||
|
|
|
||
|
|
### After `composer require`
|
||
|
|
|
||
|
|
By default, recipes are automatically unpacked after running `composer require`
|
||
|
|
for a recipe package:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
composer require drupal/example_recipe
|
||
|
|
```
|
||
|
|
|
||
|
|
This will:
|
||
|
|
1. Download the recipe and its dependencies
|
||
|
|
2. Add the recipe's dependencies to your project's root `composer.json`
|
||
|
|
3. Remove the recipe itself from your dependencies
|
||
|
|
4. Update your `composer.lock` file
|
||
|
|
|
||
|
|
### After `composer create-project`
|
||
|
|
|
||
|
|
Recipes are always automatically unpacked when creating a new project from a
|
||
|
|
template that requires this plugin:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
composer create-project drupal/recommended-project my-project
|
||
|
|
```
|
||
|
|
|
||
|
|
Any recipes included in the project template will be unpacked during
|
||
|
|
installation, as long as the plugin is enabled.
|
||
|
|
|
||
|
|
## Configuration
|
||
|
|
|
||
|
|
Configuration options are set in the `extra` section of your `composer.json`
|
||
|
|
file:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"extra": {
|
||
|
|
"drupal-recipe-unpack": {
|
||
|
|
"ignore": ["drupal/recipe_to_ignore"],
|
||
|
|
"on-require": true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Available Options
|
||
|
|
|
||
|
|
| Option | Type | Default | Description |
|
||
|
|
|--------|------|---------|-------------|
|
||
|
|
| `ignore` | array | `[]` | List of recipe packages to exclude from unpacking |
|
||
|
|
| `on-require` | boolean | `true` | Automatically unpack recipes when required by `composer require` |
|
||
|
|
|
||
|
|
## How Recipe Unpacking Works
|
||
|
|
|
||
|
|
1. The system identifies packages of type `drupal-recipe` during installation
|
||
|
|
2. For each recipe not in the ignore list, it:
|
||
|
|
- Extracts its dependencies
|
||
|
|
- Adds them to the root `composer.json`
|
||
|
|
- Recursively processes any dependencies that are also recipes
|
||
|
|
- Removes the recipe and any dependencies that are also recipes from the root
|
||
|
|
`composer.json`
|
||
|
|
3. Updates all necessary Composer files:
|
||
|
|
- `composer.json`
|
||
|
|
- `composer.lock`
|
||
|
|
- `vendor/composer/installed.json`
|
||
|
|
- `vendor/composer/installed.php`
|
||
|
|
|
||
|
|
## Cases Where Recipes Will Not Be Unpacked
|
||
|
|
|
||
|
|
Recipes will **not** be unpacked in the following scenarios:
|
||
|
|
|
||
|
|
1. **Explicit Ignore List**: If the recipe is listed in the `ignore` array in
|
||
|
|
your `extra.drupal-recipe-unpack` configuration
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"extra": {
|
||
|
|
"drupal-recipe-unpack": {
|
||
|
|
"ignore": ["drupal/recipe_name"]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Disabled Automatic Unpacking**: If `on-require` is set to `false` in your
|
||
|
|
`extra.drupal-recipe-unpack` configuration
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"extra": {
|
||
|
|
"drupal-recipe-unpack": {
|
||
|
|
"on-require": false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **Development Dependencies**: Recipes in the `require-dev` section are not
|
||
|
|
automatically unpacked
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"require-dev": {
|
||
|
|
"drupal/dev_recipe": "^1.0"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
You will need to manually unpack these using the `drupal:recipe-unpack`
|
||
|
|
command if desired.
|
||
|
|
|
||
|
|
4. **With `--no-install` Option**: When using `composer require` with the
|
||
|
|
`--no-install` flag
|
||
|
|
```bash
|
||
|
|
composer require drupal/example_recipe --no-install
|
||
|
|
```
|
||
|
|
In this case, you'll need to run `composer install` afterward and then
|
||
|
|
manually unpack using the `drupal:recipe-unpack` command.
|
||
|
|
|
||
|
|
## Example Usage Scenarios
|
||
|
|
|
||
|
|
### Basic Recipe Installation
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# This will automatically install and unpack the recipe
|
||
|
|
composer require drupal/example_recipe
|
||
|
|
```
|
||
|
|
|
||
|
|
The result:
|
||
|
|
- Dependencies from `drupal/example_recipe` are added to your root
|
||
|
|
`composer.json`
|
||
|
|
- `drupal/example_recipe` itself is removed from your dependencies
|
||
|
|
- You'll see a message: "drupal/example_recipe unpacked successfully."
|
||
|
|
- The recipe files will be present in the drupal-recipe installer path
|
||
|
|
|
||
|
|
### Manual Recipe Unpacking
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# First require the recipe without unpacking
|
||
|
|
composer require drupal/example_recipe --no-install
|
||
|
|
composer install
|
||
|
|
|
||
|
|
# Then manually unpack it
|
||
|
|
composer drupal:recipe-unpack drupal/example_recipe
|
||
|
|
```
|
||
|
|
|
||
|
|
### Working with Dev Recipes
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# This won't automatically unpack (dev dependencies aren't auto-unpacked)
|
||
|
|
composer require --dev drupal/dev_recipe
|
||
|
|
|
||
|
|
# You'll need to manually unpack if desired (with confirmation prompt)
|
||
|
|
composer drupal:recipe-unpack drupal/dev_recipe
|
||
|
|
```
|
||
|
|
|
||
|
|
### Creating a New Project with Recipes
|
||
|
|
|
||
|
|
```bash
|
||
|
|
composer create-project drupal/recipe-based-project my-project
|
||
|
|
```
|
||
|
|
|
||
|
|
Any recipes included in the project template will be automatically unpacked
|
||
|
|
during installation.
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
1. **Review Recipe Contents**: Before requiring a recipe, review its
|
||
|
|
dependencies to understand what will be added to your project.
|
||
|
|
|
||
|
|
2. **Consider Versioning**: When a recipe is unpacked, its version constraints
|
||
|
|
for dependencies are merged with your existing constraints, which may result
|
||
|
|
in complex version requirements.
|
||
|
|
|
||
|
|
3. **Dev Dependencies**: Be cautious when unpacking development recipes, as
|
||
|
|
their dependencies will be moved to the main `require` section, not
|
||
|
|
`require-dev`.
|
||
|
|
|
||
|
|
4. **Custom Recipes**: When creating custom recipes, ensure they have the
|
||
|
|
correct package type `drupal-recipe` and include appropriate dependencies.
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Recipe Not Unpacking
|
||
|
|
|
||
|
|
- Check if the package type is `drupal-recipe`
|
||
|
|
- Verify it's not in your ignore list
|
||
|
|
- Confirm it's not in `require-dev` (which requires manual unpacking)
|
||
|
|
- Ensure you haven't used the `--no-install` flag without following up with
|
||
|
|
installation and manual unpacking
|
||
|
|
|
||
|
|
### Unpacking Errors
|
||
|
|
|
||
|
|
If you encounter issues during unpacking:
|
||
|
|
|
||
|
|
1. Check Composer's error output for specific issues and run commands with the
|
||
|
|
`--verbose` flag
|
||
|
|
2. Verify that version constraints between your existing dependencies and the
|
||
|
|
recipe's dependencies are compatible
|
||
|
|
3. For manual troubleshooting, consider temporarily setting `on-require` to
|
||
|
|
`false` and unpacking recipes one by one
|