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_.
@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.
Aqui está meu _composer.json_ https://github.com/nella/framework/blob/composer/composer.json
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.
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
.
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