Saya menggunakan pemuatan otomatis dengan pemuat file khusus. Dan saya punya masalah karena loader saya bergantung pada beberapa kelas dari vendor. Tetapi komposer membutuhkan pemuat saya sebelum pemuat vendor.
Berikut dihasilkan 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;
});
Saya perlu memuat _Nette_ sebelum libs saya (_Nella_) karena loader (_Nella_) saya memerlukan beberapa kelas dari _Nette_.
@Seldaek Saya rasa urutan di sini harus menghormati urutan yang ditemukan saat menyelesaikan dependensi, sehingga file autoloading dari sebuah dependensi dimuat sebelum file dari sebuah paket bergantung padanya.
Yup itu masuk akal, tidak yakin seberapa mudah untuk mencapainya meskipun setelah dijalankan pertama kali saya pikir itu cukup acak.
Saya tidak sepenuhnya yakin saya mengerti ini? Semua autoloader akan dibutuhkan, dan urutannya tidak penting?
Sunting: tidak masalah saya mengerti :)
Solver seharusnya sudah mengembalikan ini dalam urutan yang benar dalam transaksi, termasuk kasus ketika paket sudah diinstal, jadi tidak yakin mengapa urutannya salah.
Ini _composer.json_ saya https://github.com/nella/framework/blob/composer/composer.json
Saya baru saja mengalami masalah yang sama dengan kdyby/forms-replicator
{
"name":"kdyby/forms-replicator",
"require":{
"php":">=5.3.2",
"nette/nette":"*"
},
"autoload":{
"files":["Replicator.php"]
}
}
Urutan require
dalam autoload_real.php
harus sesuai dengan bagaimana paket saling membutuhkan.
Perbaikan @HosipLan digabungkan.
Bagaimana cara menandai bahwa lib kita harus dimuat terlebih dahulu?
Maksud saya, itu tidak tergantung pada yang lain, tetapi itu harus dimuat terlebih dahulu sebelum hal lain dimuat.
Saya memiliki pertanyaan yang sama dengan @onlyongunz - Saya telah menginstal apigen/apigen
dan symfony/var-dumper
secara global, tetapi ketika saya menggunakan dump()
versi dari tracy/tracy
(diperlukan oleh ApiGen) disebut. Saya ingin menggunakan versi VarDumper.
Alangkah baiknya bisa menentukan urutan. Atau bahkan lebih baik: miliki opsi tambahan untuk menentukan file yang perlu dimuat terlebih dahulu.
Use case: Mencoba untuk menimpa fungsi helper dari laravel karena mereka secara khusus didefinisikan dengan pemikiran tersebut, tetapi tidak ada cara untuk memberitahu komposer bahwa definisi saya harus datang sebelum definisi asli laravel.
Saya pikir saya akan menyarankan load_first
untuk memprioritaskan paket saat dimuat ketika tidak bergantung pada pustaka lain (kecuali itu php atau yang lain), dan menambahkan --ignore-order
untuk mengabaikan load_first
.
Komentar yang paling membantu
Alangkah baiknya bisa menentukan urutan. Atau bahkan lebih baik: miliki opsi tambahan untuk menentukan file yang perlu dimuat terlebih dahulu.
Use case: Mencoba untuk menimpa fungsi helper dari laravel karena mereka secara khusus didefinisikan dengan pemikiran tersebut, tetapi tidak ada cara untuk memberitahu komposer bahwa definisi saya harus datang sebelum definisi asli laravel.
Konteks: https://laracasts.com/index.php/discuss/channels/general-discussion/override-functions-in-supporthelpersphp
Solusi: https://github.com/funkjedi/composer-include-files