カスタム インストーラー プラグインの自動読み込みをアンインストールする方法
<p>Composer パッケージのカスタム インストーラーを作成しようとしましたが、動作させることができません。今必要なのは次のとおりです:</p><p><ul><li>パッケージをルート ディレクトリにインストールしたいです。私のパッケージ名は rootdata21/hati なので、hati フォルダーをプロジェクトのルートに移動しました。 </li><li>ここで、次のように、composer.json ファイルの autoload psr4 属性にエントリを追加して更新しました。 { "autoload": { "psr-4": { "hati" : "hati /" } } }</li></ul></p><p>しかし、実際には、composer.jsonファイル内のオートローダーを反映するためにcomposerにオートローダーを再生成させる方法がわかりません。新しい自動ロード エントリ。以下は私のインストーラークラスです。</p>
<pre class="brush:php;toolbar:false;"><?php
名前空間 hatiinstaller;
ComposerInstallerLibraryInstaller を使用します。
ComposerIOIOInterface を使用します。
ComposerPackagePackageInterface を使用します。
ComposerPartialComposer を使用します。
ComposerRepositoryInstalledRepositoryInterface を使用します。
ComposerScriptScriptEvents を使用します。
haticonfigConfigWriter を使用します。
ReactPromisePromiseInterface を使用します。
クラス インストーラー extends LibraryInstaller {
プライベート文字列 $root;
プライベート文字列 $hatiDir;
保護された $composer;
public function __construct(IOInterface $io, PartialComposer $composer, $root) {
$this ->作曲家 = $composer;
$this ->ルート = $root 。 DIRECTORY_SEPARATOR;
$this -> hatiDir = $root 。 DIRECTORY_SEPARATOR 。 「ハティ」。 DIRECTORY_SEPARATOR;
親::__construct($io, $composer);
}
パブリック関数 getInstallPath(PackageInterface $package): string {
'rootdata21' を返します。
}
public function install(InstalledRepositoryInterface $repo, PackageInterface $package): ?PromiseInterface {
if (file_exists($this -> hatiDir)) {
$choice = $this ->イオ -> ask('既存の hati フォルダが見つかりました。削除しますか? [y/n]: ', 'n');
if ($choice === 'y') {
self::rmdir($this -> hatiDir);
} それ以外 {
$this ->イオ -> Critical('Hati のインストールはキャンセルされました。Hati フォルダーを手動で削除してください。');
null を返します。
}
}
returnparent::install($repo, $package)->then(function() {
// hati フォルダーをプロジェクトのルート ディレクトリに移動します
$old = $this ->根 。 「ルートデータ21」。 DIRECTORY_SEPARATOR .'hati';
rename($old, $this -> hatiDir);
// rootdata21 フォルダーを削除します
self::rmdir($this -> root . 'rootdata21');
// プロジェクトのルート ディレクトリに hati.json ファイルを生成/更新します
$createNewConfig = true;
if (file_exists($this -> root . 'hati.json')) {
while(true) {
$ans = $this ->イオ -> ask('既存の hati.json が見つかりました。新しい設定とマージしますか? [y/n]: ');
if ($ans !== 'y' && $ans !== 'n') 続行;
壊す;
}
$createNewConfig = $ans == 'n';
}
require_once "{$this -> hatiDir}config" . DIRECTORY_SEPARATOR . "ConfigWriter.php";
$result = ConfigWriter::write($this->root, $createNewConfig);
// 結果をユーザーに表示します
if ($result['success']) {
$this ->イオ -> info($result['msg']);
$welcomeFile = $this -> hatiDir 。 'ページ/welcome.txt';
if (file_exists($welcomeFile)) include($welcomeFile);
} それ以外 {
$this ->イオ ->エラー($result['msg']);
}
$this -> dumpAutoload();
});
}
public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) {
returnparent::update($repo, $initial, $target) -> then(関数() {
require_once "{$this -> hatiDir}config" . DIRECTORY_SEPARATOR 。 "ConfigWriter.php";
$result = ConfigWriter::write($this->root);
// 結果をユーザーに表示します
if ($result['success']) {
$this ->イオ -> info('Hati は正常に更新されました');
} それ以外 {
$this ->イオ ->エラー($result['msg']);
}
});
}
パブリック関数サポート($packageType): bool {
return 'hati-installer' === $packageType;
}
プライベート関数 dumpAutoload(): void {
$composerJsonPath = $this ->根 。 '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));
// Composer 自動ロード ファイルを再生成してクラスを含めます
$this ->作曲家 -> getEventDispatcher() -> dispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP);
}
パブリック静的関数 rmdir($dir): bool {
if (!file_exists($dir)) は true を返します。
if (!is_dir($dir)) は unlink($dir) を返します。
foreach (scandir($dir) as $item) {
if ($item == '.' || $item == '..') 続行;
if (!self::rmdir($dir . DIRECTORY_SEPARATOR . $item)) は false を返します。
}
rmdir($dir)を返します;
}
}</pre>
<p><br /></p>