Rumah > Soal Jawab > teks badan
P粉0685109912023-08-01 09:38:32
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.
public function getInstallPath(PackageInterface $package): string { return 'hati'; }
public function install(InstalledRepositoryInterface $repo, PackageInterface $package): ?PromiseInterface { // Setting custom psr-4 entry for hati folder being on project root $autoload = $package -> getAutoload(); if (isset($autoload['psr-4'])) { $customPSR4 = ['hati\' => '/',]; $autoload['psr-4'] = array_merge($autoload['psr-4'], $customPSR4); // Let the composer know about this $package -> setAutoload($autoload); } return parent::install($repo, $package) -> then(function () { // Manipulate the hati/hati folder to hati on project root self::copy($this -> root . 'hati' . DIRECTORY_SEPARATOR . 'hati', $this -> root . '_temp'); self::rmdir($this -> root . 'hati'); rename($this -> root . '_temp',$this -> root . 'hati'); // rest of the installation code goes here... }); }
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')