Comment désinstaller le chargement automatique dans le plugin d'installation personnalisé
P粉466909449
2023-07-31 10:06:51
<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>
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.
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')