Comment désinstaller le chargement automatique dans le plugin d'installation personnalisé
P粉466909449
P粉466909449 2023-07-31 10:06:51
0
1
382
<p>J'ai essayé d'écrire un programme d'installation personnalisé pour mon package Composer, mais je n'arrive pas à le faire fonctionner. Ce dont j'ai besoin maintenant, c'est :</p><p><ul><li>Je souhaite que mon package soit installé dans le répertoire racine. Le nom de mon package est rootdata21/hati, j'ai donc déplacé le dossier hati vers la racine du projet. </li><li>Maintenant, je l'ai mis à jour en ajoutant une entrée à l'attribut autoload psr4 du fichier composer.json comme suit : { "autoload": { "psr-4": { "hati" : "hati /" } } }</li></ul></p><p>Mais je ne sais pas vraiment comment faire en sorte que composer régénére le chargeur automatique pour refléter ceux du fichier composer.json. nouvelle entrée de chargement automatique. Ci-dessous se trouve ma classe d'installation.</p><p><br /></p> <pre class="brush:php;toolbar:false;"><?php hatiinstaller l'espace de noms ; utilisez ComposerInstallerLibraryInstaller ; utilisez ComposerIOIOInterface ; utilisez ComposerPackagePackageInterface ; utilisez ComposerPartialComposer ; utilisez ComposerRepositoryInstalledRepositoryInterface ; utilisez ComposerScriptScriptEvents ; utilisez haticonfigConfigWriter ; utilisez ReactPromisePromiseInterface ; Le programme d'installation de classe étend LibraryInstaller { chaîne privée $root ; chaîne privée $hatiDir ; protégé $compositeur ; fonction publique __construct(IOInterface $io, PartialComposer $composer, $root) { $ ceci -> compositeur = $compositeur; $ ceci -> racine = $racine . DIRECTORY_SEPARATOR ; $ ceci -> hatiDir = $root . DIRECTORY_SEPARATOR . 'hati'. DIRECTORY_SEPARATOR ; parent::__construct($io, $composer); } fonction publique getInstallPath (PackageInterface $package) : string { renvoie « rootdata21 » ; } installation de fonction publique (InstalledRepositoryInterface $repo, PackageInterface $package) : ?PromiseInterface { if (file_exists($this -> hatiDir)) { $choix = $this -> io -> request('Dossier hati existant trouvé. Voulez-vous le supprimer ? [o/n]: ', 'n'); si ($choix === 'y') { self::rmdir($this -> hatiDir); } autre { $ ceci -> io -> critique('L'installation de Hati a été annulée. Veuillez supprimer le dossier Hati manuellement.'); renvoie null ; } } return parent::install($repo, $package)->then(function () { // Déplace le dossier hati vers le répertoire racine du projet $ancien = $this -> racine . 'données racine21'. DIRECTORY_SEPARATOR .'hati'; rename($old, $this -> hatiDir); // supprime le dossier rootdata21 self::rmdir($this -> root . 'rootdata21'); // générer/mettre à jour le fichier hati.json sur le répertoire racine du projet $createNewConfig = vrai ; if (file_exists($this -> root . 'hati.json')) { tandis que (vrai) { $ans = $this -> io -> request('Hati.json existant trouvé. Voulez-vous le fusionner avec une nouvelle configuration ? [o/n] : '); if ($ans !== 'y' && $ans !== 'n') continuer ; casser; } $createNewConfig = $ans == 'n'; } require_once "{$this -> hatiDir}config" . DIRECTORY_SEPARATOR . "ConfigWriter.php"; $result = ConfigWriter::write($this->root, $createNewConfig); // montre le résultat à l'utilisateur si ($résultat['succès']) { $ ceci -> io -> info($result['msg']); $welcomeFile = $this -> hatiDir. 'page/bienvenue.txt'; if (file_exists($welcomeFile)) include($welcomeFile); } autre { $ ceci -> io -> erreur($result['msg']); } $ ceci -> dumpAutoload(); }); } mise à jour de la fonction publique (InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { return parent::update($repo, $initial, $target) -> alors (fonction () { require_once "{$this -> hatiDir}config" . DIRECTORY_SEPARATOR . "ConfigWriter.php" ; $result = ConfigWriter::write($this->root); // montre le résultat à l'utilisateur si ($résultat['succès']) { $ ceci -> io -> info('Hati a été mis à jour avec succès'); } autre { $ ceci -> io -> erreur($result['msg']); } }); } la fonction publique prend en charge ($packageType) : bool { return 'hati-installer' === $packageType; } fonction privée dumpAutoload() : void { $composerJsonPath = $this -> racine . 'compositeur.json'; $composerJson = json_decode(file_get_contents($composerJsonPath), true); $composerJson['autoload']['psr-4']['hati'] = 'hati/'; file_put_contents($composerJsonPath, json_encode($composerJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); // Régénère les fichiers de chargement automatique de Composer pour inclure vos classes $ ceci -> compositeur -> getEventDispatcher() -> dispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP); } fonction statique publique rmdir($dir): bool { if (!file_exists($dir)) renvoie vrai ; if (!is_dir($dir)) return unlink($dir); foreach (scandir($dir) comme $item) { if ($item == '.' || $item == '..') continuer ; if (!self::rmdir($dir . DIRECTORY_SEPARATOR . $item)) renvoie false ; } return rmdir($dir); } }</pré> <p><br /></p>
P粉466909449
P粉466909449

répondre à tous(1)
P粉068510991

J'ai réussi à réaliser ce que je voulais faire. Je vais donc ici vous expliquer l'aide que je recherche.

Normalement, si je n'utilise aucun plugin d'installation personnalisé, Composer installera mon package dans le répertoire du fournisseur nommé "rootdata21/hati". Mais pour une raison quelconque, l’intégralité du code source de mon package doit se trouver à la racine du projet. Et je ne veux pas non plus avoir de dossier parent nommé rootdata21.

J'ai donc écrit un plugin pour ça. Le plugin renvoie "rootdata21" comme chemin d'installation. Cela place mon package dans le répertoire racine, mais la structure des dossiers devient désormais "rootdata21/hati". Par conséquent, j'ai dû remplacer la méthode d'installation pour la modifier. Cependant, même si j'obtiens l'emplacement et la structure du dossier souhaité en copiant/renommant/supprimant les dossiers de "rootdata21/hati", le chargeur automatique ne fonctionne toujours pas avec mon code source déplacé. J'ai ensuite dû mettre à jour manuellement le fichier composer.json pour régénérer le chargeur automatique, ce qui va à l'encontre de l'objectif d'avoir un programme d'installation. C'est ce que je veux réaliser, c'est qu'après avoir déplacé mon dossier de package vers la racine du projet, le chargeur automatique fonctionne toujours correctement.

Il s'agit de mon code d'installation final mis à jour qui fonctionne comme je le souhaite.


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...
    });
}

Après tout cela, le fichier supplier/composer/autoload_psr4.php a le chemin de classe défini correctement, comme vous pouvez le voir sur la capture d'écran.

J'ai dû renvoyer "hati" comme chemin d'installation car si je renvoyais "rootdata21" et utilisais le code d'installation ci-dessus, j'obtiendrais l'enregistrement autoload_psr4.php suivant, qui ne fonctionne pas correctement.


'hati\' => array($baseDir . '/rootdata') 
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!