Estoy usando la carga automática con el cargador de archivos personalizados. Y tengo un problema porque mi cargador depende de algunas clases de los proveedores. Pero el compositor requiere mi cargador antes que el cargador del proveedor.
Aquí se genera 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;
});
Necesito cargar _Nette_ antes de mis libs (_Nella_) porque mi cargador (_Nella_) requiere algunas clases de _Nette_.
@Seldaek Supongo que el orden aquí debe respetar el orden encontrado al resolver las dependencias, de modo que el archivo de carga automática de una dependencia se cargue antes que el archivo de un paquete que depende de él.
Sí, eso tiene sentido, no estoy seguro de lo fácil que es lograrlo, aunque después de la primera ejecución creo que es bastante aleatorio.
¿No estoy completamente seguro de entender esto? Se requerirán todos los cargadores automáticos, y entonces el orden no debería importar.
Editar: no importa, lo entiendo :)
El solucionador ya debería devolverlos en el orden correcto en la transacción, incluido el caso en el que los paquetes ya están instalados, por lo que no estoy seguro de por qué el orden sería incorrecto.
Aquí está mi _composer.json_ https://github.com/nella/framework/blob/composer/composer.json
Acabo de experimentar el mismo problema con kdyby/forms-replicator
{
"name":"kdyby/forms-replicator",
"require":{
"php":">=5.3.2",
"nette/nette":"*"
},
"autoload":{
"files":["Replicator.php"]
}
}
El orden de require
en autoload_real.php
debe corresponder a cómo los paquetes se requieren entre sí.
Se fusionó la solución de
¿Cómo marcar que nuestra lib debe cargarse primero?
Quiero decir, no depende de otros, pero debe cargarse primero antes de cargar cualquier otra cosa.
Tengo la misma pregunta que @onlyongunz : he instalado globalmente apigen/apigen
y symfony/var-dumper
, pero cuando uso la versión dump()
de tracy/tracy
(requerido por ApiGen) se llama. Quiero usar la versión de VarDumper.
Sería bueno poder definir el orden. O incluso mejor: tenga una opción adicional para definir los archivos que deben cargarse primero.
Caso de uso: intentar anular las funciones auxiliares de laravel, ya que se definen específicamente con eso en mente, pero no hay forma de decirle al compositor que mi definición debe ir antes que la nativa de laravel.
Solución alternativa: https://github.com/funkjedi/composer-include-files
Bueno, creo que sugeriré load_first
para priorizar el paquete en carga cuando no dependa de otra biblioteca (a menos que sea php o algo más), y agregaré --ignore-order
para ignorar el load_first
.
Comentario más útil
Sería bueno poder definir el orden. O incluso mejor: tenga una opción adicional para definir los archivos que deben cargarse primero.
Caso de uso: intentar anular las funciones auxiliares de laravel, ya que se definen específicamente con eso en mente, pero no hay forma de decirle al compositor que mi definición debe ir antes que la nativa de laravel.
Contexto: https://laracasts.com/index.php/discuss/channels/general-discussion/override-functions-in-supporthelpersphp
Solución alternativa: https://github.com/funkjedi/composer-include-files