Laravel не устанавливает пакеты require-dev дистрибутивного пакета Laravel

#php #laravel #composer-php

#php #laravel #композитор-php

Вопрос:

Я создал дистрибутивный пакет Laravel со всеми пакетами Laravel, которые используют все мои веб-сайты. Я также создал пользовательский веб-сайт Laravel, который использует этот дистрибутивный пакет.

К сожалению, когда я запускаю composer install —dev во 2-м файле composer, он не устанавливает пакеты require-dev из пакета laravel-distro composer, например phpunit/phpunit

Laravel-конфигурация композитора дистрибутива:

 $ cat laravel-distro/composer.json
{
    "name": "dennis00/laravel-distro",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
    "license": "MIT",
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.8.*",
        "laravel/tinker": "^1.0",
        "laravel/installer": "^2.0.1"
    },
    "require-dev": {
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^2.0",
        "phpunit/phpunit": "^7.5"
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "vendor-dir": "vendor",
        "sort-packages": true
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\Foundation\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-root-package-install": [
            "@php -r "file_exists('.env') || copy('.env.example', '.env');""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    },
    "autoload": {
        "psr-4": {
            "App\": "app/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\": "tests/"
        }
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}
  

Laravel-пример конфигурации композитора:

 $ cat laravel-example/composer.json
{
    "name": "dennis00/laravel-example",
    "description": "Example of Laravel Distro",
    "type": "project",
    "license": "GPL-2.0 ",
    "minimum-stability": "dev",
    "repositories": [
        {
            "type": "composer",
            "url": "https://packages.drupal.org/8"
        }
    ],
    "autoload": {
        "classmap": [
            "scripts/composer/ScriptHandler.php"
        ]
    },
    "scripts": {
        "post-root-package-install": [
            "@php -r "file_exists('.env') || copy('.env.example', '.env');""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    },
    "require": {
        "dennis00/laravel-distro": "dev-master@dev",
        "laravel/horizon": "^4.0@dev"
    }
}
  

Вы можете видеть, что пакеты require-dev здесь отсутствуют.

 root@f506ece6f4ea:/var/www/html# ls vendor
autoload.php  cakephp dennis00  doctrine   egulias  fideloper   jakub-onderka  laravel  monolog  nette  ocramius  paragonie  phpstan  psy        ramsey     symfony   vlucas
bin       composer  dnoegel   dragonmantank  erusev   guzzlehttp  jean85       league   nesbot   nikic  opis  phpoption  psr      ralouphie  swiftmailer  tijsverkoyen

root@f506ece6f4ea:/var/www/html# ls vendor_backup/
autoload.php  bin dnoegel   dragonmantank  erusev     filp  hamcrest       laravel  mockery  myclabs  nikic       opis   phar-io  phpoption  phpunit  psy     sebastian  symfony  tijsverkoyen  webmozart
beyondcode    composer  doctrine  egulias  fideloper  fzaninotto  jakub-onderka  league monolog  nesbot   nunomaduro  paragonie  phpdocumentor  phpspec    psr      ramsey  swiftmailer  theseer  vlucas
root@f506ece6f4ea:/var/www/html#
  

Ответ №1:

Этого не произойдет, это сделано намеренно.

Поскольку пакеты находятся в require-dev разделе первого базового файла package.json, это будет установлено, только если вы работаете composer install с этим пакетом.

Поскольку вы переносите этот пакет в другой проект, composer установит только те зависимости из пакета, которых нет в require-dev .

Это потому, что require-dev предназначен только для разработки этого пакета и не должен требоваться для использования пакета в чем-то другом. Если вам нужно, чтобы эти пакеты были установлены при использовании вашего базового пакета, тогда вы должны поместить их в require , а не require-dev .