Bagaimana untuk menyahpasang autoloading dalam pemalam pemasang tersuai
P粉466909449
P粉466909449 2023-07-31 10:06:51
0
1
431
<p>Saya telah cuba menulis pemasang tersuai untuk pakej Komposer saya tetapi tidak dapat berfungsi. Apa yang saya perlukan sekarang ialah:</p><p><ul><li>Saya mahu pakej saya dipasang dalam direktori akar. Nama pakej saya rootdata21/hati, jadi saya mengalihkan folder hati ke akar projek. </li><li>Sekarang saya mengemas kininya dengan menambahkan entri pada atribut psr4 autoload fail composer.json seperti berikut: { "autoload": { "psr-4": { "hati" : "hati /" } } }</li></ul></p><p>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.</p><p><br /></p> <pre class="brush:php;toolbar:false;"><?php namespace hatiinstaller; gunakan ComposerInstallerLibraryInstaller; gunakan ComposerIOIOInterface; gunakan ComposerPackagePackageInterface; gunakan ComposerPartialComposer; gunakan ComposerRepositoryInstalledRepositoryInterface; gunakan ComposerScriptScriptEvents; gunakan haticonfigConfigWriter; gunakan ReactPromisePromiseInterface; class Installer memanjangkan LibraryInstaller { rentetan persendirian $akar; rentetan peribadi $hatiDir; dilindungi $composer; fungsi awam __build(IOInterface $io, PartialComposer $composer, $root) { $ini -> 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); } }</pre> <p><br /></p>
P粉466909449
P粉466909449

membalas semua(1)
P粉068510991

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') 
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan