Composer パッケージのカスタム インストーラーを作成しようとしましたが、動作させることができません。今必要なのは次のとおりです:
しかし、実際には、composer.jsonファイル内のオートローダーを反映するためにcomposerにオートローダーを再生成させる方法がわかりません。新しい自動ロード エントリ。以下は私のインストーラークラスです。
作曲家 = $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)を返します; } }
やりたかったことは無事に達成できました。そこで、ここで私が探しているヘルプについて説明します。
通常、カスタム インストール プラグインを使用しない場合、Composer はパッケージを「rootdata21/hati」という名前のベンダー ディレクトリにインストールします。しかし、何らかの理由で、パッケージのソース コード全体がプロジェクト ルートに存在する必要があります。また、rootdata21 という名前の親フォルダーも持ちたくありません。
そこで私はこれ用のプラグインを書きました。プラグインはインストール パスとして「rootdata21」を返します。パッケージはルート ディレクトリに配置されますが、フォルダー構造は「rootdata21/hati」になります。したがって、インストール方法をオーバーライドして変更する必要がありました。ただし、「rootdata21/hati」からフォルダーをコピー/名前変更/削除して、必要なフォルダーの場所と構造を取得したとしても、オートローダーは再配置されたソースコードでは動作しません。次に、composer.json ファイルを手動で更新してオートローダーを再生成する必要がありましたが、これではインストーラーの目的が損なわれてしまいます。これが私が達成したいことです。パッケージフォルダーをプロジェクトルートに移動した後も、オートローダーが引き続き適切に動作するようにすることです。
これは、私が希望どおりに動作する、最終的に更新されたインストーラー コードです。
リーリー リーリーこれらすべての操作の後、スクリーンショットに見られるように、vendor/composer/autoload_psr4.php ファイルにはクラスパスが正しく設定されています。
「rootdata21」を返して上記のインストール コードを使用すると、次の autoload_psr4.php レコードが取得され、正しく動作しないため、インストール パスとして「hati」を返す必要がありました。
リーリー