Eric
Eric

Reputation: 1261

Adding multiple Composer packages

I'm using Composer to install multiple packages using the following syntax:

{
    "require": {
        "aws/aws-sdk-php": "2.*",
        "vimeo/vimeo-api": "1.1.*",
        "phpoffice/phpexcel": "dev-master"
    }
}

The above works just fine, but now I'd like to add tcpdf via composer. I found this code here but am not sure how to integrate with my current requires. One thing that I tried was to just add it to the end, but I fear that it started deleting my current packages.

{
    "name": "tecnick.com/tcpdf",
    "version": "6.2.11",
    "homepage": "http://www.tcpdf.org/",
    "type": "library",
    "description": "TCPDF is a PHP class for generating PDF documents and barcodes.",
    "keywords": [
        "PDF",
        "tcpdf",
        "PDFD32000-2008",
        "qrcode",
        "datamatrix",
        "pdf417",
        "barcodes"
    ],
    "license": "LGPLv3",
    "authors": [
        {
            "name": "Nicola Asuni",
            "email": "[email protected]",
            "homepage": "http://nicolaasuni.tecnick.com"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "classmap": [
            "fonts",
            "config",
            "include",
            "tcpdf.php",
            "tcpdf_parser.php",
            "tcpdf_import.php",
            "tcpdf_barcodes_1d.php",
            "tcpdf_barcodes_2d.php",
            "include/tcpdf_colors.php",
            "include/tcpdf_filters.php",
            "include/tcpdf_font_data.php",
            "include/tcpdf_fonts.php",
            "include/tcpdf_images.php",
            "include/tcpdf_static.php",
            "include/barcodes/datamatrix.php",
            "include/barcodes/pdf417.php",
            "include/barcodes/qrcode.php"
        ]
    }

Upvotes: 27

Views: 39677

Answers (5)

featherbelly
featherbelly

Reputation: 954

If anyone else comes here and wants to know how to add "multiple" packages, simply use the Composer require command and run multiple CLI commands by terminating them with a semi-colon, e.g.

composer require drupal/pathauto;
composer require 'drupal/google_analytics:^3.0';
composer require 'doctrine/doctrine-bundle:2.*';
composer require 'monolog/monolog:~2.0.0';

Alternatively run with the --no-update flag to disable automatic update of dependencies and run all the updates together — composer will resolve dependencies in one hit:

composer require drupal/pathauto --no-update;
composer require 'drupal/google_analytics:^3.0' --no-update;
composer require 'doctrine/doctrine-bundle:2.*' --no-update;
composer require 'monolog/monolog:~2.0.0' --no-update;
composer update;

If you don't specify a version then composer will automatically pull the latest release. It's worth reading up on Composer versions and constraints, especially when it comes to updating packages. Check the Composer require command for more useful flags.

It can be useful to keep package requirements on separate lines as above, e.g. if you have a reference document of regularly installed packages, or if the commands are being generated by a build tool.

Alternatively you can run them all on one line:

composer require drupal/pathauto 'drupal/google_analytics:^3.0' 'doctrine/doctrine-bundle:2.*' 'monolog/monolog:~2.0.0';

N.B. Terminating commands with a semi-colon is a general solution for running multiple CLI commands, and not just composer specific, e.g.

composer self-update;
composer require 'drupal/google_analytics:^3.0';
cd app/build;
yarn run build;

Upvotes: 14

William Turrell
William Turrell

Reputation: 3326

If you want to add handful of packages without having to wait tediously for composer to update after each and every one, but you prefer not to:

  • change a long series of modules together in a single line (poor readability, less convenient to reuse)
  • use a semi-colon delimited list of commands (featherbelly's answer - easy to insert a typo or accidentally paste a carriage return and screw it up midway through)

…then use the --no-update switch to have composer modify the composer.json file ONLY, without searching for packages.

You can run as few or as many as you want, use the CLI to do something else midway through, and when you're ready, just do composer-update by itself.

Here's an example of adding some Drupal modules for a new project:

composer require 'drupal/field_permissions:^1.0' --no-update
composer require 'drupal/coffee:^1.0' --no-update
composer require 'drupal/token:^1.5' --no-update
composer require 'drupal/field_tools:^1.0' --no-update
composer require 'drupal/required_by_role:^1.0' --no-update
composer require 'drupal/devel:^2.1' --no-update
composer require 'drupal/config_ignore:^2.1' --no-update
composer require 'drupal/ga_login:^1.0' --no-update
composer require 'drupal/tfa:^1.0' --no-update
composer require 'drupal/spambot:^1.0' --no-update
composer require 'drupal/pathauto:^1.4' --no-update
composer require 'drupal/flag:^4.0' --no-update
composer require 'drupal/stringoverrides:1.x-dev' --no-update
composer require 'drupal/structure_sync:^1.16' --no-update
composer require 'drupal/masquerade:^2.0' --no-update
composer require 'drupal/metatag:^1.8' --no-update
composer require 'drupal/unique_field_ajax:^1.2' --no-update
composer require 'drupal/config_override_warn:^1.2' --no-update
composer require 'drupal/environment_indicator:^3.6' --no-update
composer require 'drupal/role_delegation:^1.0' --no-update
composer require 'drupal/seo_checklist:^4.1' --no-update

composer update

NB: If you know what the modules you need and are typing your list manually anyway, just edit composer.json by hand - there's no point manually typing "composer require" over and over again.

However, the above method is handy for sites like Drupal where you're copying and pasting pre-written commands that contain complex version syntax for branches, individual commits etc.

Upvotes: 2

ioni
ioni

Reputation: 493

As a matter of fact, you can list all the packages separated by space, like so:

composer require aws/aws-sdk-php vimeo/vimeo-api phpoffice/phpexcel 

Quote:

If you do not want to choose requirements interactively, you can pass them to the command

From Composer documentation

Also consider --update-with-all-dependencies to update the dependencies of all newly installed packages.

Upvotes: 20

Francisco Daniel
Francisco Daniel

Reputation: 1029

You can require many packages from the command line, for example:

composer require barryvdh/laravel-debugbar barryvdh/laravel-snappy fideloper/proxy

And all the packages will be required according to your composer specifications.

Upvotes: 51

Sven
Sven

Reputation: 70863

To add "tecnick.com/tcpdf" to an existing composer.json file, on the commandline inside the directory containing it run:

composer require tecnick.com/tcpdf

You shouldn't have to manually edit the composer.json file for such things.

Upvotes: 8

Related Questions