Composer: Arquivos de carregamento automático - carregue os fornecedores primeiro

Criado em 30 jul. 2012  ·  11Comentários  ·  Fonte: composer/composer

Estou usando o carregamento automático com o carregador de arquivos personalizados. E eu tenho um problema porque meu carregador depende de algumas classes de fornecedores. Mas o compositor requer meu loader antes do vendor loader.

Aqui é gerado autoloader.php :

<?php

// autoload.php generated by Composer
if (!class_exists('Composer\\Autoload\\ClassLoader', false)) {
    require __DIR__ . '/composer' . '/ClassLoader.php';
}

return call_user_func(function() {
    $loader = new \Composer\Autoload\ClassLoader();
    $composerDir = __DIR__ . '/composer';

    $map = require $composerDir . '/autoload_namespaces.php';
    foreach ($map as $namespace => $path) {
        $loader->add($namespace, $path);
    }

    $classMap = require $composerDir . '/autoload_classmap.php';
    if ($classMap) {
        $loader->addClassMap($classMap);
    }

    $loader->register();

    require $baseDir . '/Nella/loader.php'; // <-- my libs
    require $vendorDir . '/nette/nette/Nette/loader.php'; // <-- vendor libs

    return $loader;
});

Eu preciso carregar _Nette_ antes de minhas bibliotecas (_Nella_) porque meu carregador (_Nella_) requer algumas classes de _Nette_.

Bug

Comentários muito úteis

Seria bom poder definir o pedido. Ou ainda melhor: tem uma opção extra para definir os arquivos que precisam ser carregados primeiro.

Caso de uso: Tentar substituir as funções auxiliares de laravel, pois elas são definidas especificamente com isso em mente, mas não há como dizer ao compositor que minha definição deve vir antes da definição nativa de laravel.

Contexto: https://laracasts.com/index.php/discuss/channels/general-discussion/override-functions-in-supporthelpersphp

Solução alternativa: https://github.com/funkjedi/composer-include-files

Todos 11 comentários

@Seldaek Acho que a ordem aqui deve respeitar a ordem encontrada ao resolver as dependências, de forma que o arquivo de autoload de uma dependência seja carregado antes do arquivo de um pacote dependente dela.

Sim, isso faz sentido, não tenho certeza de como é fácil de conseguir, embora depois da primeira corrida eu ache que é bastante aleatório.

Não tenho certeza se entendi isso? Todos os autoloaders serão necessários e a ordem não importa?

Edit: deixa pra lá, entendi :)

O solucionador já deve estar retornando estes na ordem correta na transação, incluindo o caso em que os pacotes já estão instalados, portanto, não tenho certeza porque o pedido estaria incorreto.

Acabei de experimentar o mesmo problema com kdyby/forms-replicator

{
    "name":"kdyby/forms-replicator",
    "require":{
        "php":">=5.3.2",
        "nette/nette":"*"
    },
    "autoload":{
        "files":["Replicator.php"]
    }
}

A ordem de require em autoload_real.php deve corresponder a como os pacotes requerem um ao outro.

Correção de @HosipLan mesclada .

Como marcar que nosso lib deve ser carregado primeiro?
Quer dizer, não depende de outro, mas deve ser carregado antes de qualquer outra coisa ser carregada.

Eu tenho a mesma pergunta que @onlyongunz - Eu instalei globalmente apigen/apigen e symfony/var-dumper , mas quando eu uso a versão dump() de tracy/tracy (exigido pela ApiGen) é chamado. Eu quero usar a versão do VarDumper.

Seria bom poder definir o pedido. Ou ainda melhor: tem uma opção extra para definir os arquivos que precisam ser carregados primeiro.

Caso de uso: Tentar substituir as funções auxiliares de laravel, pois elas são definidas especificamente com isso em mente, mas não há como dizer ao compositor que minha definição deve vir antes da definição nativa de laravel.

Contexto: https://laracasts.com/index.php/discuss/channels/general-discussion/override-functions-in-supporthelpersphp

Solução alternativa: https://github.com/funkjedi/composer-include-files

Bem, eu acho que vou sugerir load_first para priorizar o pacote no carregamento quando ele não dependia de outra biblioteca (a menos que seja php ou outra coisa), e adicionar --ignore-order para ignorar o load_first .

Esta página foi útil?
0 / 5 - 0 avaliações