Package a component

Overview of packaging

The Magento application uses Composer packages to distribute, install, and upgrade components in an application instance.

To package a component, you must:

  • Create a Magento Composer file (composer.json).
  • Register the component using registration.php
  • Package and publish your component.

    Use our validation tool to check your package before you distribute it.

Create a Magento Composer file

The Magento 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:

Element Description
name A fully-qualified component name, in the format <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>.
type For modules, this value must be set to magento2-module. Other possible types are metapackage, magento2-theme, and magento2-language.
autoload Specify necessary information to be loaded, such as registration.php. For more information, see Autoloading from Composer.

The following table discusses the component types that Magento Marketplace supports. The composer type column in the following table specifies the value of the type field you must add to composer.json for that type of component.

Friendly name composer.json type Description
Metapackage metapackage Technically, a Composer package type, not a Magento component type. A metapackage consists of only a composer.json file that specifies a list of components and their dependencies. For example, both Magento Open Source and Magento Commerce are metapackages.
Module magento2-module Code that modifies Magento application behavior. You can upload a single module to the Magento Marketplace or your module can be dependent on some parent package.
Theme magento2-theme Code that modifies the look and feel of the storefront or Magento Admin.
Language package magento2-language Translations for the storefront or Admin.
Library magento2-library Support for libraries located in lib/internal instead of in the vendor directory.
Component magento2-component The package formed of the files that must be located in root (index.php, .htaccess, etc). This includes dev/tests and setup as well for now.

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 Magento Marketplace should be a .zip file containing only the metapackage composer.json file.

We recommend metapackages refer to specific component versions. Do not use wildcards to represent version ranges.

Metapackage example

The following example is a composer.json for a metapackage:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

{
    "name": "magento/product-community-edition",
    "description": "A sample metapackage",
    "version": "2.0.0",
    "type": "metapackage",
    "require": {
        "php": "~7.1.3|~7.2.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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "name": "magento/sample-module-newpage",
  "description": "A Magento 2 module that creates a new page",
  "type": "magento2-module",
  "version": "1.0.0",
  "license": [
    "OSL-3.0",
    "AFL-3.0"
  ],
  "require": {
    "php": "~7.1.3|~7.2.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:

1
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.

Magento can retrieve your extension package from any valid GitHub URL.

Third party repositories are supported.

Hosting on GitHub and Packagist

Prerequisite: Git must be set up on your machine.

  1. Navigate to your component directory, with the composer.json file in the root, and make it a new Git repository. See the GitHub documentation for details.
  2. 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.

      1. Register an account at packagist.org.
      2. Click the Submit Package button and paste your GitHub repository link. Packagist automatically gathers the information from the component’s composer.json file and link it to the GitHub repository, allowing you to reference the package as vendor/module without any additional repository information, because this is required solely using GitHub.

Hosting on a private repository

If you use the Setup Wizard, you must use the Magento Marketplace repository. A private repository can be used for development or private code but installation must be done with a command line interface (you can install a package that specifies a private repository only with a command line installation).

  1. Set up your own Composer packaging repository using a system such as Satis or Private Packagist.
  2. Create the package in a way similar to the described above.
  3. 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.
  4. To use the private packaging repository in a project, add the following to your composer.jsonfile:

    1
    2
    3
    4
    5
    6
    7
    8
    
    {
        "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.