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

Composer - запускать скрипты только в среде dev

Это мой файл composer.json:

"require": {
    "php": ">=5.4",
    "zendframework/zendframework": "2.*",
    "doctrine/doctrine-module": "dev-master",
    "doctrine/doctrine-orm-module": "0.*",
    "gedmo/doctrine-extensions": "dev-master"
},
"require-dev": {
    "phpunit/phpunit": "3.7.*"
},
"scripts": {
    "post-update-cmd": [
        "rm -rf vendor/Behat",
        "git clone git://github.com/Behat/Behat.git",
        "cp composer.phar Behat/composer.phar",
        "cd Behat && git submodule update --init",
        "cd Behat && php composer.phar install",
        "cd Behat && php composer.phar require guzzle/guzzle:3.0.*",
        "mv Behat vendor/Behat",
        "ln -sf ../Behat/bin/behat vendor/bin/"
    ]
}

Как это сделать, чтобы скрипты выполнялись только в среде dev?

В основном я хочу, чтобы сценарии запускались только при вызове:

php composer.phar update --dev
4b9b3361

Ответ 1

Чтобы выполнить обновление среды без разработки без запуска сценариев, используйте параметр командной строки --no-scripts для команды update:

php composer.phar update --no-scripts
                         ^^^^^^^^^^^^

По умолчанию сценарии Composer выполняются только в базовом пакете. Таким образом, вы можете иметь один пакет для разработки и в реальной среде сделать его зависимым от живой системы.

Кроме того, я не вижу способа дифференцировать сценарии автоматически.

Ответ 2

Невозможно выбрать другой script для установки по умолчанию и параметр - dev, но вы можете использовать метод isDevMode() в Композиторе \Script\Event для запуска команды только в среде разработки. http://getcomposer.org/apidoc/master/Composer/Script/Event.html

Ответ 3

Вы можете добиться такого же эффекта, настроив пользовательский script для пути dev вместо использования post-update-cmd hook.

"scripts": {
    "update-behat": [
        "rm -rf vendor/Behat",
        "git clone git://github.com/Behat/Behat.git",
        "cp composer.phar Behat/composer.phar",
        "cd Behat && git submodule update --init",
        "cd Behat && php composer.phar install",
        "cd Behat && php composer.phar require guzzle/guzzle:3.0.*",
        "mv Behat vendor/Behat",
        "ln -sf ../Behat/bin/behat vendor/bin/"
    ],
    "dev-update": [
        "@composer update --dev",
        "@update-behat"
    ]
}

Затем просто запустите php composer.phar dev-update

Ответ 4

Вы можете использовать COMPOSER_DEV_MODE переменного окружения (новый в версии 1.3.0-RC - 2016-12-11):

"scripts": {
    "post-install-cmd": [
        "[ $COMPOSER_DEV_MODE -eq 0 ] || echo devmode only"
    ]
},

Ответ 5

Вступление

Некоторые из ответов немного кратки и не дают подробностей о контексте, в котором это делается. Я хотел бы поделиться некоторыми знаниями с тем, кто все еще озадачен после прочтения предыдущих ответов.

Определите правильный вариант для вас

Во-первых, найдите время, чтобы понять, что вы эффективно создаете другой поток, специфичный для определенной среды (например, ваш сервер/контейнер разработки). Это противоречит любым лучшим практикам, так как обычно подвержено ошибкам. Сказав это, вы можете достичь того, что вы хотите несколькими способами;

Не вызывает никаких скриптов (документов)

Если в какой-либо среде вы не хотите запускать какие-либо сценарии, вы можете предотвратить это с помощью флага --no-scripts.

Документация гласит: --no-scripts: пропускает выполнение скриптов, определенных в composer.json.

composer upgrade --no-scripts

Это особенно полезно при обновлении пакетов, когда ваш код в данный момент не работает. Это также будет работать, если ваши единственные сценарии связаны с разработкой и тестированием.

Запуск одного скрипта отдельно (документы)

Просто запустите определенную команду по мере необходимости:

composer run-script [--dev] [--no-dev] script

Это полезно, когда вы хотите запускать скрипт только в определенных случаях.

Например, в системах сборки, которые перед выполнением каких-либо тестов должны выполнить определенный сценарий; Системы сборки предлагают параметры конфигурации для вызова пользовательских сценариев, как указано выше.

Определение условия в команде (документы)

Документация гласит: Во время процесса установки или обновления композитора переменная с именем COMPOSER_DEV_MODE будет добавлена в среду. Если команда была запущена с флагом --no-dev, эта переменная будет установлена в 0, в противном случае она будет установлена в 1.

Пример может выглядеть так

"scripts": {
    "post-install-cmd": [
         "[ $COMPOSER_DEV_MODE -eq 0 ] || <your command>"
    ]
}

Лично я бы сказал, что это рекомендуемый способ, если вы используете контейнеры.

Примечание: это не работает на окнах, так как для этого потребуется %COMPOSER_DEV_MODE%.

Существуют также пакеты (например, scriptsdev by neronmoon), которые помогают вам достичь той же цели, не вводя вышеуказанное во всех командах, используя раздел dev-scripts в extra разделе в composer.json.

Определение условия в вашем PHP-скрипте (документы)

Вызовите метод PHP, который проверяет вашу среду на основе того, как ваше приложение уже делает это. Вы даже можете повторно использовать это условие, комбинируя его с методом, описанным выше; "Определение условия в команде".

"scripts": {
    "post-update-cmd": [
        "AppNameSpaceName\\YourClassName::methodName"
    ]
}

Затем вы можете создать класс следующим образом:

<?php

namespace AppNameSpaceName;

class YourClassName 
{
    methodName() {
         // do stuff
    }
}

Во многих современных средах уже существует механизм для определения среды выполнения приложения (способ Symfony, способ Laravel).

Пряжа работает (документы)

Поскольку в настоящее время большинство приложений PHP также переносят свои файлы javascript, будет установлен либо NPM, либо Yarn. Вы можете использовать раздел сценариев для запуска этой части только на машинах/контейнерах разработки. Например:

yarn run dev-only-script

имея раздел в package.json

"scripts": {
    "dev-only-script": "rm some/folder && ln -s path/to/your/folder some/"
}

Дело в том, что ваш composer.json будет чистым. В Yarn у вас могут быть скрипты для dev-server, test и build.

Ответ 6

Вот небольшой пакет, который вы можете использовать для этого. https://github.com/neronmoon/scriptsdev Он добавляет возможность определять скрипты только-dev. Использование

...
"extra": {
    "scripts-dev": {
    "post-install-cmd": [
        "npm install --dev"
    ],
    "post-update-cmd": "php ./someCoolCommand.php"
    },
}
...

Ответ 7

Запустите следующую команду.

 composer update --no-scripts