添加多个Composer包

25

我正在使用Composer通过以下语法安装多个软件包:

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

上面的代码运行得很好,但是现在我想通过composer添加tcpdf。 我在这里找到了这个代码,但不确定如何与我的当前要求集成。 我尝试过的一件事是只将其添加到末尾,但我担心它会开始删除我的当前包。

{
    "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": "info@tecnick.com",
            "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"
        ]
    }

你已经尝试了什么?为什么不像其他软件包一样安装tcpdf呢? - Nico Haase
5个回答

49

您可以从命令行要求许多软件包,例如:

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

所有的软件包都将根据您的composer规格要求进行安装。


19

事实上,你可以把所有的软件包用空格分隔列出来,像这样:

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

引用:

如果您不想交互地选择要求,请将它们直接传递给该命令。

来自Composer文档

同时考虑使用--update-with-all-dependencies来更新所有新安装包的依赖项。


我试图更新phpunit/phpunit ^8,但composer只是给了我“结论:不要安装sebastian/object-enumerator 3.0.3”。使用“--update-with-all-dependencies”可以很好地解决这个问题。我以为如果你require一个包,composer会自动处理这个问题。 - musicman

12
如果其他人想知道如何添加“多个”软件包,只需使用Composer require命令并通过分号终止多个CLI命令即可。
composer require drupal/pathauto;
composer require 'drupal/google_analytics:^3.0';
composer require 'doctrine/doctrine-bundle:2.*';
composer require 'monolog/monolog:~2.0.0';

另外,您可以使用--no-update标志运行,以禁用依赖项的自动更新并一次性运行所有更新 - Composer将一次性解决依赖关系:

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;

如果您没有指定版本,那么Composer将自动拉取最新的发布版。值得阅读Composer版本和约束条件,尤其是在更新包时。查看Composer require命令以获取更多有用的标志。
像上面这样将软件包要求保持在单独的行上可能会很有用,例如如果您有一个经常安装的软件包参考文档,或者如果命令是由构建工具生成的。
或者您可以在一行上运行它们所有:
composer require drupal/pathauto 'drupal/google_analytics:^3.0' 'doctrine/doctrine-bundle:2.*' 'monolog/monolog:~2.0.0';

注意:在CLI中使用分号作为终止命令的通用解决方案,不仅适用于composer,例如:


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

1
根据文档提供的信息:只需在一个调用中列出所有需要的软件包,这比运行多个软件包要简单和快速。 - Nico Haase

7
要在现有的composer.json文件中添加"tecnick.com/tcpdf",请在包含该文件的目录中运行以下命令行:
composer require tecnick.com/tcpdf

您不应该手动编辑composer.json文件来进行此类操作。


谢谢你的提示,我从来不知道我可以通过命令行添加包。你知道作者为什么会提供额外的json吗?这是我也能在命令行中“看到”的东西吗? - Eric
1
作者没有提供那个额外的JSON供您使用。首先,您链接的是克隆存储库,而不是原始存储库。其次,您想要使用Composer安装的每个软件包都必须具有一些元数据,以便Composer工作,而这些元数据在此文件中。它仅适用于TCPDF——其中唯一有用的信息是“名称”字段,因为如果您想使用该软件包,则必须安装该软件包。查找该名称的另一种方法是转到https://packagist.org并搜索库。通常在那里可以找到指向库主页和存储库的链接。 - Sven
完全有道理;我没有意识到大部分的JSON具有不同的用途。 - Eric

2
如果您想添加一些软件包而不必等待Composer在每个软件包更新后进行冗长的更新,但又不想:
  • 在单行中更改一系列模块(可读性差,重用不方便)
  • 使用分号分隔的命令列表(featherbelly's answer - 容易出现拼写错误或意外粘贴回车并在中途出错)
…那么使用--no-update开关,让Composer仅修改composer.json文件,而不搜索软件包。
您可以运行尽可能少或尽可能多的软件包,并在中途使用CLI执行其他操作,当您准备好时,只需执行composer-update即可。
以下是为新项目添加一些Drupal模块的示例:
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

注意:如果你知道你需要哪些模块并且仍然手动输入列表,只需手动编辑composer.json - 手动一遍又一遍地输入"composer require"是没有意义的。
然而,上述方法对于像Drupal这样的网站很方便,因为你可以复制和粘贴包含分支、单独提交等复杂版本语法的预先编写的命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接