So deinstallieren Sie Autoloading im benutzerdefinierten Installations-Plugin
<p>Ich habe versucht, ein benutzerdefiniertes Installationsprogramm für mein Composer-Paket zu schreiben, kann es aber nicht zum Laufen bringen. Was ich jetzt brauche ist:</p><p><ul><li>Ich möchte, dass mein Paket im Stammverzeichnis installiert wird. Mein Paketname ist rootdata21/hati, daher habe ich den Hati-Ordner in das Stammverzeichnis des Projekts verschoben. </li><li>Jetzt habe ich es aktualisiert, indem ich einen Eintrag zum Autoload-PSR4-Attribut der Composer.json-Datei wie folgt hinzugefügt habe: { "autoload": { "psr-4": { "hati" : "hati /" } } }</li></ul></p><p>Aber ich weiß eigentlich nicht, wie ich Composer dazu bringen kann, den Autoloader neu zu generieren, um die in der Composer.json-Datei widerzuspiegeln. Dies Neuer Autoload-Eintrag. Unten ist meine Installer-Klasse.</p><p><br /></p>
<pre class="brush:php;toolbar:false;"><?php
Namespace hatiinstaller;
Verwenden Sie ComposerInstallerLibraryInstaller;
Verwenden Sie ComposerIOIOInterface;
Verwenden Sie ComposerPackagePackageInterface.
benutze ComposerPartialComposer;
Verwenden Sie ComposerRepositoryInstalledRepositoryInterface.
verwende ComposerScriptScriptEvents;
benutze haticonfigConfigWriter;
verwenden Sie ReactPromisePromiseInterface;
Klasse Installer erweitert LibraryInstaller {
private Zeichenfolge $root;
private Zeichenfolge $hatiDir;
protected $composer;
öffentliche Funktion __construct(IOInterface $io, PartialComposer $composer, $root) {
$this -> komponist = $composer;
$this -> root = $root . DIRECTORY_SEPARATOR;
$this -> hatiDir = $root . DIRECTORY_SEPARATOR . 'hati' . DIRECTORY_SEPARATOR;
parent::__construct($io, $composer);
}
öffentliche Funktion getInstallPath(PackageInterface $package): string {
return 'rootdata21';
}
öffentliche Funktion install(InstalledRepositoryInterface $repo, PackageInterface $package): ?PromiseInterface {
if (file_exists($this -> hatiDir)) {
$choice = $this -> io -> ask('Vorhandener Hati-Ordner gefunden. Möchten Sie ihn löschen? [y/n]: ', 'n');
if ($choice === 'y') {
self::rmdir($this -> hatiDir);
} anders {
$this -> io -> Critical('Hati-Installation wurde abgebrochen. Bitte löschen Sie den Hati-Ordner manuell.');
null zurückgeben;
}
}
return parent::install($repo, $package)->then(function () {
// Hati-Ordner in das Stammverzeichnis des Projekts verschieben
$old = $this -> Wurzel . 'rootdata21'. DIRECTORY_SEPARATOR .'hati';
rename($old, $this -> hatiDir);
// den Ordner rootdata21 löschen
self::rmdir($this -> root . 'rootdata21');
// die Datei hati.json im Stammverzeichnis des Projekts generieren/aktualisieren
$createNewConfig = true;
if (file_exists($this -> root . 'hati.json')) {
while(true) {
$ans = $this -> io -> ask('Vorhandenes hati.json gefunden. Möchten Sie es mit der neuen Konfiguration zusammenführen? [y/n]: ');
if ($ans !== 'y' && $ans !== 'n') continue;
brechen;
}
$createNewConfig = $ans == 'n';
}
require_once "{$this -> hatiDir}config" . DIRECTORY_SEPARATOR . "ConfigWriter.php";
$result = ConfigWriter::write($this->root, $createNewConfig);
// zeige dem Benutzer das Ergebnis
if ($result['success']) {
$this -> io -> info($result['msg']);
$welcomeFile = $this -> hatiDir . 'page/welcome.txt';
if (file_exists($welcomeFile)) include($welcomeFile);
} anders {
$this -> io -> Fehler($result['msg']);
}
$this -> dumpAutoload();
});
}
öffentliche Funktionsaktualisierung(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) {
return parent::update($repo, $initial, $target) -> then(Funktion () {
require_once "{$this -> hatiDir}config" . DIRECTORY_SEPARATOR . „ConfigWriter.php“;
$result = ConfigWriter::write($this->root);
// zeige dem Benutzer das Ergebnis
if ($result['success']) {
$this -> io -> info('Hati wurde erfolgreich aktualisiert');
} anders {
$this -> io -> Fehler($result['msg']);
}
});
}
öffentliche Funktion unterstützt($packageType): bool {
return 'hati-installer' === $packageType;
}
private Funktion dumpAutoload(): void {
$composerJsonPath = $this -> Wurzel . 'composer.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));
// Generieren Sie die Composer-Autoload-Dateien neu, um Ihre Klassen einzuschließen
$this -> Komponist -> getEventDispatcher() -> DispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP);
}
öffentliche statische Funktion rmdir($dir): bool {
if (!file_exists($dir)) return true;
if (!is_dir($dir)) return unlink($dir);
foreach (scandir($dir) as $item) {
if ($item == '.' || $item == '..') continue;
if (!self::rmdir($dir . DIRECTORY_SEPARATOR . $item)) return false;
}
return rmdir($dir);
}
}</pre>
<p><br /></p>