Подтвердить что ты не робот

Использование Composer для установки пакетов npm и bower при производстве (т.е. DevDependencies)

В моем файле composer.json у меня есть следующее в разделе сценариев:

    "post-install-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "npm install",
        "bower install"
    ]

При запуске 'composer install' это заставит npm и bower устанавливать все свои зависимости, которые по умолчанию включают devDependencies. Когда дело доходит до выполнения производственного цикла (например, "установка композитора --no-dev", я хочу запустить "npm install --production" и "bower install --production" )

Насколько я могу судить, не существует способа изменить список, указанный для "post-install-command" в зависимости от переданных флагов, или способ установки переменных, которые затем могут быть переданы команд в post-install-cmd.

Я что-то упустил? Невозможно использовать композитор для создания как dev, так и производственной установки, используя только конфигурацию. Действительно ли я должен использовать composer install --no-scripts для производства, а затем вручную запускать все четыре команды самостоятельно? Это кажется немного неуклюжим.

4b9b3361

Ответ 1

Вы всегда можете использовать PHP для обнаружения среды для вас, а затем установить другие зависимости из того же script. Это не приятно и чисто, как включение npm и bower в post-install-cmd, но оно даст вам то, что вы ищете.

"post-install-cmd": [
     "php artisan clear-compiled",
     "php artisan optimize",
     "php path/to/installer.php"
 ]

Пример installer.php:

// Logic to determine the environment. This could be determined many ways, and depends on how your
// application environment is determined. If you're making use of Laravel environment
// capabilities, you could do the following:
$env = trim(exec('php artisan env'));

// Clean up response to get the value we actually want
$env = substr($env, strrpos($env, ' ') + 1);

$envFlag = ($env === 'production')
    ? '--production'
    : '';

// Install npm
passthru("npm install {$envFlag}");
// Install bower
passthru("bower install {$envFlag}");

Вы можете сделать этот пример более надежным и даже создать для него команду Artisan.

Ответ 2

Немного взломать, но вы можете получить родительскую команду PID с $PPID в bash. Из этого вы можете получить аргументы командной строки.

"post-install-cmd": [
    "ps -ocommand= -p $PPID | grep no-dev > /dev/null && echo called with no-dev || echo called without no-dev",
],

Если бы вы сделали это, я бы поместил его в bash script и выполнил его следующим образом: run-if-env-is-production.sh "bower install --production"

Я бы порекомендовал решение @kwoodfriend по этому поводу, хотя это менее портативно, так как оно требует bash, ps и grep.

Ответ 3

Это сработает;

"post-update-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "npm install",
        "bower install"
    ],
"post-install-cmd": [
    "php artisan clear-compiled",
    "php artisan optimize",
    "npm install --production",
    "bower install --production"
]

то есть. вы должны запускать "обновление" в своей среде разработки и только когда-либо запускать "install" в своей производственной среде.

Ответ 4

Поскольку я использую npm, bower и gulp для создания своих активов, мне не нужны какие-либо из них при производстве, поэтому вот композитор .json я использую:

    "post-install-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent install",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent install --global bower",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || bower --silent install"
    ],
    "post-update-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent update",
        "(ps -ocommand= -p $PPID | grep -q no-dev && true) || bower --silent update"
    ]

... Но мне кажется странным использовать такую ​​сложную команду, чтобы обнаружить среду dev, или нет...

Ответ 5

Весь пример блока из Composer.org

{
    "scripts": {
        "post-update-cmd": "MyVendor\\MyClass::postUpdate",
        "post-package-install": [
            "MyVendor\\MyClass::postPackageInstall"
        ],
        "post-install-cmd": [
            "MyVendor\\MyClass::warmCache",
            "phpunit -c app/"
        ],
        "post-create-project-cmd" : [
            "php -r \"copy('config/local-example.php', 'config/local.php');\""
        ]
    }
}