Maison > Questions et réponses > le corps du texte
P粉0685109912023-08-01 09:38:32
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')