Php 从两个composer.json文件安装composer

Php 从两个composer.json文件安装composer,php,laravel-5,composer-php,vendor,Php,Laravel 5,Composer Php,Vendor,我有多个composer.json具有多个独立的依赖项,并希望使用单个composer install命令在这两个composer.json中安装所有依赖项 位置如下所示: | - composer.json | - Custom | - Package1 | - composer.json { "config": { "vendor-dir": "../../vendor/" } } { "name": "laravel/la

我有多个
composer.json
具有多个独立的依赖项,并希望使用单个
composer install
命令在这两个
composer.json
中安装所有依赖项

位置如下所示:

| - composer.json
| - Custom
    | - Package1
        | - composer.json
{
    "config": {
        "vendor-dir": "../../vendor/"
    }
}
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.6.4",
        "barryvdh/laravel-debugbar": "^2.3",
        "laravel/framework": "5.4.*",
        "laravel/tinker": "~1.0",
        "wikimedia/composer-merge-plugin": "^1.4"
    },
    "require-dev": {
        "fzaninotto/faker": "~1.4",
        "mockery/mockery": "0.9.*",
        "phpunit/phpunit": "~5.7",
        "symfony/css-selector": "3.1.*",
        "symfony/dom-crawler": "3.1.*"
    },
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
    "autoload-dev": {
        "psr-4": {
          "Tests\\": "tests/"
        }
    },
    "scripts": {
        "post-root-package-install": [
            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ],
        "post-install-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postInstall",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "php artisan optimize"
        ]
    },
    "config": {
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true
    },
    "extra": {
        "merge-plugin": {
            "include": [
                "Custom/*/composer.json"
            ],
            "recurse": true,
            "replace": false,
            "ignore-duplicates": true,
            "merge-dev": true,
            "merge-extra": false,
            "merge-extra-deep": false,
            "merge-scripts": true
        }
    }
}
Firstcomposer.json

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.6.4",
        "barryvdh/laravel-debugbar": "^2.3",
        "laravel/framework": "5.4.*",
        "laravel/tinker": "~1.0",
        "laravelcollective/html": "^5.4.0"
    },
    "require-dev": {
        "fzaninotto/faker": "~1.4",
        "mockery/mockery": "0.9.*",
        "phpunit/phpunit": "~5.7",
        "symfony/css-selector": "3.1.*",
        "symfony/dom-crawler": "3.1.*"
    },
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/",
        }
    },
    "autoload-dev": {
        "psr-4": {
          "Tests\\": "tests/"
        }
    },
    "scripts": {
        "post-root-package-install": [
            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ],
        "post-install-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postInstall",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "php artisan optimize"
        ]
    },
    "config": {
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true
    }
}
第二个composer.json在Package1目录中

{
    "name": "custom/package1",
    "description": "",
    "require": {
        "php": ">=5.6",
        "composer/installers": "~1.0",
        "lavary/laravel-menu": "1.7.1"
    },
    "autoload": {
        "psr-4": {
            "Custom\\Package1\\": ""
        }
    }
}
我想将
lavary/laravel菜单
安装在
Package1
主供应商目录中,所有默认软件包都安装在该目录中

|- vendor  //<==want here
| - composer.json
    | - Custom
        | - Package1
            | - vendor  //<== not here
            | - composer.json
这将安装软件包,但我们需要进入第二个composer.json而不是主composer.json,并从第一个composer.json中删除已安装的软件包


如何安装主composer.json中的所有依赖项,而不进入单个供应商目录中的第二个或多个composer.json?

经过一些研究和建议,我发现有多种方法可以实现此解决方案

  • 使用外部包来维护依赖关系
  • 谢谢你让我知道

    编写器合并插件

    {
        "name": "laravel/laravel",
        "description": "The Laravel Framework.",
        "keywords": ["framework", "laravel"],
        "license": "MIT",
        "type": "project",
        "require": {
            "php": ">=5.6.4",
            "barryvdh/laravel-debugbar": "^2.3",
            "laravel/framework": "5.4.*",
            "laravel/tinker": "~1.0",
            "laravelcollective/html": "^5.4.0"
        },
        "require-dev": {
            "fzaninotto/faker": "~1.4",
            "mockery/mockery": "0.9.*",
            "phpunit/phpunit": "~5.7",
            "symfony/css-selector": "3.1.*",
            "symfony/dom-crawler": "3.1.*"
        },
        "autoload": {
            "classmap": [
                "database"
            ],
            "psr-4": {
                "App\\": "app/",
            }
        },
        "autoload-dev": {
            "psr-4": {
              "Tests\\": "tests/"
            }
        },
        "scripts": {
            "post-root-package-install": [
                "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
            ],
            "post-create-project-cmd": [
                "php artisan key:generate"
            ],
            "post-install-cmd": [
                "Illuminate\\Foundation\\ComposerScripts::postInstall",
                "php artisan optimize"
            ],
            "post-update-cmd": [
                "Illuminate\\Foundation\\ComposerScripts::postUpdate",
                "php artisan optimize"
            ]
        },
        "config": {
            "preferred-install": "dist",
            "sort-packages": true,
            "optimize-autoloader": true
        }
    }
    

    首先,我们需要这个软件包:

    composer require wikimedia/composer-merge-plugin
    
    然后我的composer.json变成这样:

    | - composer.json
    | - Custom
        | - Package1
            | - composer.json
    
    {
        "config": {
            "vendor-dir": "../../vendor/"
        }
    }
    
    {
        "name": "laravel/laravel",
        "description": "The Laravel Framework.",
        "keywords": ["framework", "laravel"],
        "license": "MIT",
        "type": "project",
        "require": {
            "php": ">=5.6.4",
            "barryvdh/laravel-debugbar": "^2.3",
            "laravel/framework": "5.4.*",
            "laravel/tinker": "~1.0",
            "wikimedia/composer-merge-plugin": "^1.4"
        },
        "require-dev": {
            "fzaninotto/faker": "~1.4",
            "mockery/mockery": "0.9.*",
            "phpunit/phpunit": "~5.7",
            "symfony/css-selector": "3.1.*",
            "symfony/dom-crawler": "3.1.*"
        },
        "autoload": {
            "classmap": [
                "database"
            ],
            "psr-4": {
                "App\\": "app/"
            }
        },
        "autoload-dev": {
            "psr-4": {
              "Tests\\": "tests/"
            }
        },
        "scripts": {
            "post-root-package-install": [
                "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
            ],
            "post-create-project-cmd": [
                "php artisan key:generate"
            ],
            "post-install-cmd": [
                "Illuminate\\Foundation\\ComposerScripts::postInstall",
                "php artisan optimize"
            ],
            "post-update-cmd": [
                "Illuminate\\Foundation\\ComposerScripts::postUpdate",
                "php artisan optimize"
            ]
        },
        "config": {
            "preferred-install": "dist",
            "sort-packages": true,
            "optimize-autoloader": true
        },
        "extra": {
            "merge-plugin": {
                "include": [
                    "Custom/*/composer.json"
                ],
                "recurse": true,
                "replace": false,
                "ignore-duplicates": true,
                "merge-dev": true,
                "merge-extra": false,
                "merge-extra-deep": false,
                "merge-scripts": true
            }
        }
    }
    
    现在,, 跑

    然后,每个目录中的
    composer.json
    将合并到默认的
    vendor
    目录中

  • 下一个解决方案可能是将包发布到packagist,并在composer.json中要求,在composer安装期间,将安装所有依赖项

    |- vendor  //<==want here
    | - composer.json
        | - Custom
            | - Package1
                | - vendor  //<== not here
                | - composer.json
    
    就像政府所做的那样

  • 将专用存储库添加到composer.json

  • 此选项需要将metapackage的composer.json添加到主composer.json文件中

  • (我不确定该选项,但感谢了解此解决方案的人可以对此选项添加解释。添加只是为了让某人知道此解决方案的存在。)

    以下是示例解决方案:


    在这种情况下,第一种解决方案适合我的情况。希望这对那些花了大量时间搜索的人有所帮助。

    尝试使用这两个composer文件。composer已经解决了所有这些问题。您不应触碰供应商代码。如果无法解析包,请尝试删除composer.lockfiles@MohammadTrabelsi我无法合并不同的编写器,因为它们应该单独保存以维护依赖关系,如果我们删除自定义packageComposer本身不支持此功能,它们将被删除,但是你可以用这个软件包来做这些。@delboy1978uk我不是说要碰供应商代码。它将删除另一个依赖项,因为供应商中列出了依赖项,但第二个composer.json中没有列出。另外,composer.lock不会妨碍我,因为我可以使用composer更新,但这不是我的问题。您尝试过composer路径存储库吗?你提到的插件报告了很多问题,不再更新。您的问题也可以通过composer repositories path解决吗?另请参阅Drupal上的此问题“停止使用wikimedia/composer合并插件”。不过,使用这个插件有很多缺点:它会降低性能(编写程序的过程较慢,下载更多元数据)和复杂性。建议的解决方案删除wikimedia合并插件,并将其替换为Composer“path”存储库,这是一种本机Composer功能,与合并插件具有相同的需求,但缺点较少。