Comment spécifier le chemin d'installation de Composer?

93

J'ai cette définition:

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "symfony/sfGuardPlugin",
                "version": "4.0.2",
                "dist": {
                    "url": "http://plugins.symfony-project.org/get/sfGuardPlugin/sfGuardPlugin-4.0.2.tgz",
                    "type": "tar"
                }
            }
        }
    ],
    "require": {
        "symfony/sfGuardPlugin": "4.0.*"
    }
}

J'utilise Symfony 1 et j'aimerais les installer plugins/sfGuardPlugin/. Comment le spécifier?

La tour
la source

Réponses:

140

Il semble que vous puissiez définir le vendorrépertoire comme quelque chose d'autre ( pluginsdans votre cas):

{
    "config": {
        "vendor-dir": "plugins"
    }
}

Ensuite, vous pouvez renommer le nom du package pour ne pas avoir de répertoire de niveau à l'intérieur, comme:

        "package": {
            "name": "sfGuardPlugin",

Donc, vous composer.jsondevriez ressembler à ceci:

{
    "config": {
        "vendor-dir": "plugins"
    },
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "sfGuardPlugin",
                "version": "4.0.2",
                "dist": {
                    "url": "http://plugins.symfony-project.org/get/sfGuardPlugin/sfGuardPlugin-4.0.2.tgz",
                    "type": "tar"
                }
            }
        }
    ],
    "require": {
        "sfGuardPlugin": "4.0.*"
    }
}

Éditer

En utilisant cette configuration, vous obtiendrez le chemin (ce qui n'est bien sûr pas bon pour symfony):

plugins / sfGuardPlugin / sfGuardPlugin-4.0.2 /

J'ai trouvé une solution de contournement avec ceci composer.json:

{
    "config": {
        "vendor-dir": "plugins"
    },
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "sfGuardPlugin",
                "version": "4.0.2",
                "source": {
                    "url": "http://svn.symfony-project.com/plugins/sfGuardPlugin/",
                    "type": "svn",
                    "reference": "branches/1.3/"
                }
            }
        }
    ],
    "require": {
        "sfGuardPlugin": "4.0.*"
    }
}
j0k
la source
Bien, puis-je aussi faire en sorte que le dossier extrait n'aille pas aussi profondément qu'il le fait maintenant:, à la plugins/sfGuardPlugin/sfGuardPlugin-4.0.2/place je veux plugins/sfGuardPlugin?
Tour du
Ouais, je viens de voir ça. J'essaye avec un type différent (au lieu de tar).
j0k
Cela fonctionne bien - ils ont donc toujours un référentiel après tout :)
Tour
3
y a-t-il un moyen de spécifier le répertoire du fournisseur pour un package spécifique uniquement et de laisser les autres par défaut?
mr1031011
1
C'est une réponse formidable et recherchée, mais ne perdez pas le V. d'Adam, car cela semble plus officiel, oh et facile ;-)
mTorres
28

Vous pouvez également utiliser composer / installers , un programme d'installation de bibliothèque de compositeurs multi-framework avec le type de package "symfony1-plugin". Voici à quoi ressemble mon fichier composer.json, afin qu'il puisse installer à la fois Symfony 1.4 (dans lib / vendor) et les plugins (/ plugins):

{
    "config": {
        "vendor-dir": "lib/vendor"
    },
    "repositories": {
        "symfony": {
            "type": "package",
            "package": {
                "name": "symfony/symfony1",
                "version": "1.4",
                "dist": {
                    "url": "https://github.com/symfony/symfony1/zipball/1.4",
                    "type": "zip"
                }
            }
        },
        "sfResquePlugin" : {
            "type": "package",
            "package": {
                "name": "devpips/sfResquePlugin",
                "type": "symfony1-plugin",
                "version": "0.1",
                "dist": {
                    "url": "https://github.com/devpips/sfResquePlugin/zipball/master",
                    "type": "zip"
                }
            }
        }
    },
    "require": {
        "composer/installers": "dev-master",
        "symfony/symfony1": "1.4",
        "devpips/sfResquePlugin":"0.1"
    }
}
Adam V.
la source
Je ne vois pas comment cela indiquerait quoi que ce soit /plugins- pouvez-vous élaborer?
Isaac Lubow le
@IsaacLubow, cela se fera par composer-installerspackage, tout comme symfony1un plugin :) Vérifiez Symfony1Installer.php
spirit le
11

Voir COMPOSER_VENDOR_DIRla variable d'environnement.

En définissant cette variable, vous pouvez faire en sorte que Composer installe les dépendances dans un répertoire autre que le fournisseur.

Peut être utile dans le cas où vous souhaitez remplacer cela dans un environnement particulier tel que vagrant ou docker où vous ne voudriez pas que cela se trouve dans un dossier / volume partagé.

Et comme J0k l'a dit, il y a vendor-dirdans une configsection decomposer.json

La valeur par défaut est le fournisseur. Vous pouvez installer les dépendances dans un répertoire différent si vous le souhaitez. $ HOME et ~ seront remplacés par le chemin de votre répertoire personnel dans vendor-dir et toutes les options * -dir ci-dessous.

GabLeRoux
la source