検索

ホームページ  >  に質問  >  本文

カスタム インストーラー プラグインの自動読み込みをアンインストールする方法

<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>
P粉466909449P粉466909449515日前460

全員に返信(1)返信します

  • P粉068510991

    P粉0685109912023-08-01 09:38:32

    やりたかったことは無事に達成できました。そこで、ここで私が探しているヘルプについて説明します。

    通常、カスタム インストール プラグインを使用しない場合、Composer はパッケージを「rootdata21/hati」という名前のベンダー ディレクトリにインストールします。しかし、何らかの理由で、パッケージのソース コード全体がプロジェクト ルートに存在する必要があります。また、rootdata21 という名前の親フォルダーも持ちたくありません。

    そこで私はこれ用のプラグインを書きました。プラグインはインストール パスとして「rootdata21」を返します。パッケージはルート ディレクトリに配置されますが、フォルダー構造は「rootdata21/hati」になります。したがって、インストール方法をオーバーライドして変更する必要がありました。ただし、「rootdata21/hati」からフォルダーをコピー/名前変更/削除して、必要なフォルダーの場所と構造を取得したとしても、オートローダーは再配置されたソースコードでは動作しません。次に、composer.json ファイルを手動で更新してオートローダーを再生成する必要がありましたが、これではインストーラーの目的が損なわれてしまいます。これが私が達成したいことです。パッケージフォルダーをプロジェクトルートに移動した後も、オートローダーが引き続き適切に動作するようにすることです。

    これは、私が希望どおりに動作する、最終的に更新されたインストーラー コードです。


    リーリー リーリー

    これらすべての操作の後、スクリーンショットに見られるように、vendor/composer/autoload_psr4.php ファイルにはクラスパスが正しく設定されています。

    「rootdata21」を返して上記のインストール コードを使用すると、次の autoload_psr4.php レコードが取得され、正しく動作しないため、インストール パスとして「hati」を返す必要がありました。


    リーリー

    返事
    0
  • キャンセル返事