Como especificar o caminho de instalação do Composer?

93

Eu tenho esta definição:

{
    "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.*"
    }
}

Estou usando o Symfony 1 e gostaria de instalá-los plugins/sfGuardPlugin/. Como posso especificar isso?

Torre
fonte

Respostas:

140

Parece que você pode definir o vendordir como outra coisa ( pluginsno seu caso):

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

Em seguida, você pode renomear o nome do pacote para não ter um diretório de nível dentro, como:

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

Então, você composer.jsondeve ficar assim:

{
    "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.*"
    }
}

Editar

Usando esta configuração, você obterá o caminho (que obviamente não é bom para o symfony):

plugins / sfGuardPlugin / sfGuardPlugin-4.0.2 /

Eu encontrei uma solução alternativa para isso 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
fonte
Legal, também posso fazer com que a pasta extraída não vá tão fundo quanto agora plugins/sfGuardPlugin/sfGuardPlugin-4.0.2/:, em vez disso eu quero plugins/sfGuardPlugin?
Torre
Sim, acabei de ver isso. Estou tentando com um tipo diferente (em vez de tar).
j0k
Isso funciona bem - então eles ainda têm um repositório, afinal :)
Torre
3
existe uma maneira de especificar o diretório do fornecedor apenas para alguns pacotes específicos e deixar os outros como padrão?
mr1031011
1
Esta é uma resposta ótima e pesquisada, mas não perca o V. de Adam, porque parece mais oficial, ah e fácil ;-)
mTorres
28

Você também pode usar composer / installers , um instalador de biblioteca do compositor multi-framework com o tipo de pacote "symfony1-plugin". É assim que meu arquivo composer.json se parece, para que ele instale Symfony 1.4 (em lib / vendor) e plugins em (/ 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.
fonte
Não vejo como isso apontaria para /plugins- pode explicar?
Isaac Lubow
@IsaacLubow, isso será feito por composer-installerspacote, pois symfony1tem um plugin lá :) Verifique Symfony1Installer.php
espírito
11

Veja COMPOSER_VENDOR_DIRa variável de ambiente.

Ao definir esta var, você pode fazer o Composer instalar as dependências em um diretório diferente do fornecedor.

Pode ser útil no caso de você querer sobrescrever isso em um ambiente particular, como vagrant ou docker, onde você não gostaria que isso estivesse em uma pasta / volume compartilhado.

E, como disse J0k, há vendor-dirna configseção decomposer.json

Padronizado para fornecedor. Você pode instalar dependências em um diretório diferente, se desejar. $ HOME e ~ serão substituídos pelo caminho do seu diretório pessoal em vendor-dir e todas as opções * -dir abaixo.

GabLeRoux
fonte