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
Ответы
Ответ 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