Package a component
The Adobe Commerce and Magento Open Source applications use Composer packages to distribute, install, and upgrade components in an application instance.
To package a component, you must:
- Create a Composer file (
composer.json). - Register the component using
registration.php - Package and publish your component.
Create a Composer file
The composer.json file defines the name, requirements, version, and other basic information about the component. This file must be placed in the root directory of the module.
The composer.json uses Composer's generic schema, with the following restrictions:
name<vendor-name>/<component-name>. All letters must be in lowercase. Use dashes in the <component-name> to separate words. Themes must use the format <vendor-name>/theme-<area>-<theme-name>.typemagento2-module. Other possible types are metapackage, magento2-theme, and magento2-language.autoloaddata-variant=info
data-slots=text
source and dist properties. All extensions distributed via the Marketplace are installed from the Commerce package repository. If your composer.json contains source or dist properties, it will cause failures in the EQP automation.data-src=/includes/composer-types.md
Using metapackages
Metapackages allow you to group an extension that consists of multiple packages into a cohesive unit. This works exactly as described in standard composer.json documentation. If you have an extension that uses more than one package you must use a metapackage as the root package. Otherwise you should not use metapackage. A metapackage that you submit to Commerce Marketplace should be a .zip file containing only the metapackage composer.json file.
data-variant=info
data-slots=text
Metapackage example
The following example is a composer.json for a metapackage:
{
"name": "magento/product-community-edition",
"description": "A sample metapackage",
"version": "2.0.0",
"type": "metapackage",
"require": {
"php": "~7.2.0||~7.3.0",
"zendframework/zend-stdlib": "~2.4.6",
"zendframework/zend-code": "~2.4.6",
"zendframework/zend-server": "~2.4.6",
"zendframework/zend-soap": "~2.4.6",
"zendframework/zend-uri": "~2.4.6",
"zendframework/zend-validator": "~2.4.6",
"zendframework/zend-crypt": "~2.4.6",
"zendframework/zend-console": "~2.4.6",
"zendframework/zend-modulemanager": "~2.4.6",
"zendframework/zend-mvc": "~2.4.6",
"zendframework/zend-text": "~2.4.6",
"zendframework/zend-i18n": "~2.4.6",
"ext-ctype": "*",
"ext-gd": "*",
"ext-spl": "*",
"ext-dom": "*",
"ext-simplexml": "*",
"ext-mcrypt": "*",
"ext-hash": "*",
"ext-curl": "*",
"ext-iconv": "*",
"ext-intl": "*",
"ext-xsl": "*",
"ext-mbstring": "*",
"ext-openssl": "*"
},
"license": [
"OSL-3.0",
"AFL-3.0"
]
}
Sample composer.json file
The following example is a composer.json file for a module:
{
"name": "magento/sample-module-newpage",
"description": "A module that creates a new page",
"type": "magento2-module",
"version": "1.0.0",
"license": [
"OSL-3.0",
"AFL-3.0"
],
"require": {
"php": "~7.2.0||~7.3.0",
"magento/framework": "~100.0.4"
},
"autoload": {
"files": [ "registration.php" ],
"psr-4": {
"Magento\\SampleNewPage\\": ""
}
}
}
Package and publish your extension
Create a package of your extension by performing a zip operation on the directory with your extension (excluding unnecessary directories). For example:
zip -r vendor-name_package-name-1.0.0.zip package-path/ -x 'package-path/.git/*'
Use alphanumeric characters for the package filename with dashes to separate words. Do not use whitespaces.
The application can retrieve your extension package from any valid GitHub URL.
<!-- After you have created the module's composer.json file in the root directory of the module, Composer can recognize your package as compatible with its deployment strategy. Such packages can be published to a code repository (GitHub, SVN, etc.), packagist.org, or on your own private package repository. -->
data-variant=info
data-slots=text
Hosting on GitHub and Packagist
Prerequisite: Git must be set up on your machine.
-
Navigate to your component directory, with the
composer.jsonfile in the root, and make it a new Git repository. See the GitHub documentation for details. -
When you have committed and pushed your component to your GitHub repository, you can either:
-
Use Composer to refer to it directly, or
-
Use the following steps to refer to the package through Packagist.
- Register an account at packagist.org.
- Click the Submit Package button and paste your GitHub repository link. Packagist automatically gathers the information from the component's
composer.jsonfile and link it to the GitHub repository, allowing you to reference the package asvendor/modulewithout any additional repository information, because this is required solely using GitHub.
-
Hosting on a private repository
data-variant=info
data-slots=text
-
Set up your own Composer packaging repository using a system such as Satis or Private Packagist.
-
Create the package in a way similar to the described above.
-
Submit/register the package on your own repository. For example, it can be hosted as a reference to a code repository or submitted as a zip-archive.
-
To use the private packaging repository in a project, add the following to your
composer.jsonfile:{ "repositories": [ { "type": "composer", "url": [repository url here] } ] }
All packages on the private repository can now be referenced within the require field.
Refer to the official documentation for more details on how to configure your project to use Private Packagist.