Voici mon fichier 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/"
]
}
Comment puis-je faire en sorte que les scripts ne soient exécutés que dans l'environnement de développement?
Fondamentalement, je veux que les scripts s'exécutent uniquement lorsque j'appelle:
php composer.phar update --dev
Pour effectuer la mise à jour de l'environnement sans développement sans déclencher de script, utilisez le --no-scripts
commutateur de ligne de commande pour la commande update
:
php composer.phar update --no-scripts
^^^^^^^^^^^^
Par défaut, les scripts Composer ne sont exécutés que dans le package de base. Vous pouvez donc avoir un package à développer et dans l'environnement live en faire une dépendance du système live.
En dehors de cela, je ne vois aucun moyen de différencier automatiquement les scripts.
Il n'est pas possible de choisir un script différent pour l'installation par défaut et l'option - dev mais vous pouvez utiliser la méthode isDevMode () dans Composer\Script\Event pour exécuter la commande uniquement dans un environnement de développement. http://getcomposer.org/apidoc/master/Composer/Script/Event.html
Introduction
Certaines réponses sont un peu brèves et n'entrent pas dans les détails du contexte dans lequel cela se fait. Je voudrais partager certaines connaissances avec celui qui est toujours perplexe après avoir lu les réponses précédentes.
Déterminez l'option qui vous convient
Tout d'abord, prenez un moment pour vous rendre compte que vous créez effectivement un flux différent, spécifique à un certain environnement (c'est-à-dire votre serveur/conteneur de développement). Cela est contraire aux meilleures pratiques, car il est généralement sujet à des erreurs. Cela dit, vous pouvez réaliser ce que vous voulez de plusieurs façons;
Ne déclenchant aucun script ( docs )
Si, dans certains environnements, vous ne souhaitez pas déclencher de scripts, vous pouvez empêcher cela en utilisant le --no-scripts
drapeau.
La documentation se lit comme suit: --no-scripts
: Ignore l'exécution des scripts définis dans composer.json.
composer upgrade --no-scripts
Ceci est particulièrement utile lors de la mise à niveau de packages alors que votre code ne fonctionne pas actuellement. Cela fonctionnerait également si vos seuls scripts sont liés au développement et aux tests.
Exécution d'un script séparément ( docs )
Exécutez simplement la commande spécifique selon vos besoins:
composer run-script [--dev] [--no-dev] script
Ceci est utile lorsque vous souhaitez exécuter un script uniquement à des occasions spécifiques.
Par exemple, sur des systèmes de build qui doivent exécuter un certain script avant d'exécuter des tests; les systèmes de build offrent des options de configuration pour appeler des scripts personnalisés comme ci-dessus.
Définition d'une condition dans la commande ( docs )
La documentation indique: Au cours d'un processus d'installation ou de mise à jour de composer, une variable nommée COMPOSER_DEV_MODE
sera ajouté à l'environnement. Si la commande a été exécutée avec l'indicateur --no-dev, cette variable sera définie sur 0, sinon elle sera définie sur 1.
Un exemple pourrait ressembler
"scripts": {
"post-install-cmd": [
"[ $COMPOSER_DEV_MODE -eq 0 ] || <your command>"
]
}
Personnellement, je dirais que c'est la manière recommandée si vous utilisez des conteneurs.
Remarque: cela ne fonctionne pas sur Windows, car il faudrait %COMPOSER_DEV_MODE%
.
Il existe également des packages (comme scriptsdev by neronmoon ) qui vous aident à atteindre le même objectif sans avoir à taper ce qui précède dans toutes les commandes, en utilisant un dev-scripts
section dans la section extra
dans composer.json
Définition d'une condition dans votre PHP ( docs )
Appelez une méthode PHP, qui vérifie votre environnement en fonction de la façon dont votre application le fait déjà. Vous pouvez même réutiliser cette condition en la combinant avec la méthode ci-dessus; "Définir une condition dans la commande".
"scripts": {
"post-update-cmd": [
"AppNameSpaceName\\YourClassName::methodName"
]
}
Vous pouvez ensuite continuer et créer la classe, comme ceci:
<?php
namespace AppNameSpaceName;
class YourClassName
{
methodName() {
// do stuff
}
}
Dans de nombreux frameworks modernes, il existe déjà un mécanisme pour déterminer l'environnement d'exécution de l'application ( façon Symfony , façon Laravel ).
Parcours de fil ( docs )
Étant donné que la plupart des applications PHP de nos jours transposent également leurs fichiers javascript, NPM ou Yarn seraient installés. Vous pouvez utiliser la section des scripts pour exécuter cette partie uniquement sur des machines/conteneurs de développement. Par exemple:
yarn run dev-only-script
avoir une section dans package.json
"scripts": {
"dev-only-script": "rm some/folder && ln -s path/to/your/folder some/"
}
Le but de ceci serait de nettoyer votre composer.json. En fil, vous pourriez avoir des scripts pour dev-server
, test
et build
.
Vous pouvez utiliser la variable d'environnement COMPOSER_DEV_MODE (nouveau dans la version 1.3.0-RC - 2016-12-11):
"scripts": {
"post-install-cmd": [
"[ $COMPOSER_DEV_MODE -eq 0 ] || echo devmode only"
]
},
Vous pouvez obtenir le même effet en configurant un script personnalisé pour la voie de développement, au lieu d'utiliser le post-update-cmd
crochet.
"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"
]
}
Ensuite, exécutez simplement php composer.phar dev-update
Voici le petit package que vous pouvez utiliser pour ce faire https://github.com/neronmoon/scriptsdev Il ajoute la possibilité de définir des scripts uniquement pour les développeurs. usage
...
"extra": {
"scripts-dev": {
"post-install-cmd": [
"npm install --dev"
],
"post-update-cmd": "php ./someCoolCommand.php"
},
}
...
Exécutez la commande suivante.
composer update --no-scripts