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功能,与合并插件具有相同的需求,但缺点较少。