【问题标题】:Is it possible to ignore child dependencies in Composer config?是否可以忽略 Composer 配置中的子依赖项?
【发布时间】:2016-04-10 19:27:39
【问题描述】:

当我运行 composer install 时,它会安装我所有的“require”和其他包的“require”。

我的 composer.json

{
    "name": "my_app",
    "require": {
        "some/package": "0.0.0"
    }
}

“子”依赖

{
    "name": "some/package",
    "require": {
        "zendframework/zend-mail": "2.4.*@dev",
        "soundasleep/html2text": "~0.2",
        "mpdf/mpdf": "6.0.0",
        "endroid/qrcode": "1.*@dev"
    }
}

我知道可以忽略 php 扩展,但是这些第二个 require 包呢?

【问题讨论】:

    标签: composer-php


    【解决方案1】:

    您可以使用 composer.json 的 replace 属性忽略要下载的包:https://getcomposer.org/doc/04-schema.md#replace

    这样你告诉作曲家,你自己负责或处理那个包的内容。

    这可以帮助您忽略您确定不需要的包,但它有点 hacky。所以请注意某些事情(如测试)可能会中断。 更好的方法是向原始包的维护者请求补丁以使要求成为可选(通过suggest 属性)。

    编辑:
    示例“禁用”zendframework/zend-mail 的要求:

    {
        "name": "my_app",
        "require": {
            "some/package": "0.0.0"
        },
        "replace": {
            "zendframework/zend-mail": "*"
        }
    }
    

    【讨论】:

    • 我从文档中不明白如何防止子依赖。可以举个例子吗?
    • @Bunyamin 我在帖子中添加了一个示例。
    • 如果您的任何依赖项需要特定版本,您需要将包的版本设置为相同的"version": "3.1.4",例如在"name": "some/package" 下。您基本上是用 current composer.json 本身替换该包。
    【解决方案2】:

    我知道可以忽略 php 扩展,但是这些第二个 require 包呢?

    是的,您可以使用--ignore-platform-reqs 忽略 php、hhvm、lib-* 和 ext-* 平台要求并强制安装,即使本地机器不满足这些要求。

    但是,我不确定您是否正在回答您的问题。在您的应用程序中需要一个没有其依赖项的包的用例是什么?这不是使用 Composer 的主要原因吗?

    ,这是不可能的,除非您正在寻找 require --no-update,它会禁用依赖项的自动更新。请查看CLI options for requireinstall

    【讨论】:

    • 我正在使用的包有很多我使用的“库”。所以那些没有使用的库需要我不需要的东西,但我不想只是复制文件并放弃下一次更新。
    • 我建议以不同的方式处理这个问题:获取所有内容以及子依赖项,构建您的应用程序并仅使用其中一些依赖项,然后在您构建稳定应用程序的发布包时,删除未使用的之前的库或在打包过程中忽略它们。这允许在开发过程中处理所有依赖项,但将部署的东西缩减到最低限度。
    • 对!谢谢你的建议。
    【解决方案3】:

    另一种解决方法:

    1. 将包克隆到您的存储库并修复依赖项
    2. 在您的 composer.json 中添加您的存储库:
    "repositories": [
        { "type": "git", "url": "https://github.com/zhovtyj/mailchimp-laravel" }
    ],
    "require": {
        "php": "^7.1.3",
        ***
        "skovmand/mailchimp-laravel": "dev-master",
    },
    

    【讨论】:

      【解决方案4】:

      另一个选项可能是修改子包的composer.json 并删除所需的依赖项。然后,您可以托管 zip 文件并通过为您的主包添加一个额外的存储库来添加对它的引用。

      "repositories": [
          {
              "type": "package",
              "package": {
                  "name": "dr-que/x-y",
                  "version": "master",
                  "dist": {
                      "type": "zip",
                      "url": "http://xyplot.drque.net/Downloads/XY_Plot-1.4.zip",
                      "reference": "master"
                  },
                  "autoload": {
                      "classmap": ["."]
                  }
              }
          }
      ]
      

      然后在您的要求部分中,添加您选择的名称,如下所示。

      "require": {
          "dr-que/x-y": "dev-master"
      }
      

      对于自动加载,我只是复制了子包的相同自动加载部分。

      原解决方案可以在here找到

      【讨论】:

        【解决方案5】:

        随便用

         composer install --ignore-platform-reqs
        

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:stackoverflow.com/help/how-to-answer。祝你好运?
        猜你喜欢
        • 2017-10-06
        • 1970-01-01
        • 2013-02-08
        • 2016-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多