Saya telah cuba menulis pemasang tersuai untuk pakej Komposer saya tetapi tidak dapat berfungsi. Apa yang saya perlukan sekarang ialah:
Tetapi saya sebenarnya tidak tahu bagaimana untuk mendapatkan komposer untuk menjana semula autoloader untuk mencerminkan yang dalam fail composer.json Ini kemasukan autoload baharu. Di bawah ialah kelas Pemasang saya.
komposer = $composer; $ini -> akar = $akar . DIRECTORY_SEPARATOR; $ini -> hatiDir = $root . DIRECTORY_SEPARATOR . 'hati' . DIRECTORY_SEPARATOR; parent::__construct($io, $composer); } fungsi awam getInstallPath(PackageInterface $package): rentetan { kembalikan 'rootdata21'; } pemasangan fungsi awam(InstalledRepositoryInterface $repo, PackageInterface $package): ?PromiseInterface { if (fail_wujud($ini -> hatiDir)) { $pilihan = $ini -> io -> ask('Folder hati sedia ada ditemui. Adakah anda mahu memadamkannya? [y/n]: ', 'n'); jika ($pilihan === 'y') { diri::rmdir($ini -> hatiDir); } lain { $ini -> io -> critical('Pemasangan hati telah dibatalkan. Sila padam folder hati secara manual.'); kembali null; } } return parent::install($repo, $package)->then(function () { // Alihkan folder hati ke direktori akar projek $lama = $ini -> akar . 'rootdata21'. DIRECTORY_SEPARATOR .'hati'; namakan semula($lama, $ini -> hatiDir); // padam folder rootdata21 self::rmdir($this -> root . 'rootdata21'); // jana/kemas kini fail hati.json pada direktori akar projek $createNewConfig = benar; if (file_exists($this -> root . 'hati.json')) { manakala(benar) { $ans = $ini -> io -> ask('Hati.json sedia ada ditemui. Adakah anda mahu menggabungkannya dengan konfigurasi baharu? [y/n]: '); jika ($ans !== 'y' && $ans !== 'n') teruskan; pecah; } $createNewConfig = $ans == 'n'; } memerlukan_sekali "{$ini -> hatiDir}config" . DIRECTORY_SEPARATOR . "ConfigWriter.php"; $result = ConfigWriter::write($this->root, $createNewConfig); // tunjukkan hasilnya kepada pengguna if ($result['success']) { $ini -> io -> info($result['msg']); $welcomeFile = $ini -> hatiDir . 'page/welcome.txt'; if (file_exists($welcomeFile)) include($welcomeFile); } lain { $ini -> io -> error($result['msg']); } $ini -> dumpAutoload(); }); } kemas kini fungsi awam(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { return parent::update($repo, $initial, $target) -> maka(fungsi () { memerlukan_sekali "{$this -> hatiDir}config" . DIRECTORY_SEPARATOR . "ConfigWriter.php"; $result = ConfigWriter::write($this->root); // tunjukkan hasilnya kepada pengguna if ($result['success']) { $ini -> io -> info('Hati telah berjaya dikemas kini'); } lain { $ini -> io -> error($result['msg']); } }); } fungsi awam menyokong($packageType): bool { kembalikan 'hati-installer' === $packageType; } fungsi peribadi dumpAutoload(): void { $composerJsonPath = $this -> akar . 'composer.json'; $composerJson = json_decode(file_get_contents($composerJsonPath), benar); $composerJson['autoload']['psr-4']['hati'] = 'hati/'; file_put_contents($composerJsonPath, json_encode($composerJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); // Jana semula fail autoload Komposer untuk memasukkan kelas anda $ini -> komposer -> getEventDispatcher() -> dispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP); } fungsi statik awam rmdir($dir): bool { jika (!fail_wujud($dir)) kembalikan benar; if (!is_dir($dir)) return unlink($dir); foreach (scandir($dir) sebagai $item) { jika ($item == '.' || $item == '..') teruskan; jika (!self::rmdir($dir . DIRECTORY_SEPARATOR . $item)) return false; } kembalikan rmdir($dir); } }
Saya telah berjaya mencapai apa yang saya mahu lakukan. Jadi di sini saya akan menerangkan bantuan yang saya cari.
Biasanya, jika saya tidak menggunakan sebarang pemalam pemasangan tersuai, Komposer akan memasang pakej saya dalam direktori vendor bernama "rootdata21/hati". Tetapi atas sebab tertentu keseluruhan kod sumber pakej saya perlu berada dalam akar projek. Dan saya juga tidak mahu mempunyai folder induk bernama rootdata21.
Jadi saya menulis pemalam untuk ini. Pemalam mengembalikan "rootdata21" sebagai laluan pemasangan. Ia meletakkan pakej saya dalam direktori root, tetapi struktur folder kini menjadi "rootdata21/hati". Oleh itu, saya terpaksa mengatasi kaedah pemasangan untuk mengubah suainya. Walau bagaimanapun, walaupun saya mendapat lokasi dan struktur folder yang saya mahukan dengan menyalin/menamakan semula/memadam folder daripada "rootdata21/hati", autoloader masih tidak berfungsi dengan kod sumber saya yang telah dipindahkan. Saya kemudiannya terpaksa mengemas kini fail composer.json secara manual untuk menjana semula autoloader, yang mengalahkan tujuan mempunyai pemasang. Inilah yang saya ingin capai, ialah selepas mengalihkan folder pakej saya ke akar projek, autoloader masih berfungsi dengan baik.
Ini adalah kod pemasang terakhir saya yang dikemas kini yang berfungsi seperti yang saya mahu.
Selepas semua operasi ini, fail vendor/composer/autoload_psr4.php mempunyai laluan kelas yang ditetapkan dengan betul, seperti yang anda boleh lihat dalam tangkapan skrin.
Saya terpaksa mengembalikan "hati" sebagai laluan pemasangan kerana jika saya mengembalikan "rootdata21" dan menggunakan kod pemasangan di atas, saya akan mendapat rekod autoload_psr4.php berikut, yang tidak berfungsi dengan betul.
'hati\' => array($baseDir . '/rootdata')