사용자 정의 설치 프로그램 플러그인에서 자동 로딩을 제거하는 방법
<p>Composer 패키지용 사용자 정의 설치 프로그램을 작성하려고 했지만 제대로 작동하지 않습니다. 지금 필요한 것은:</p><p><ul><li>패키지를 루트 디렉터리에 설치하고 싶습니다. 내 패키지 이름은 rootdata21/hati이므로 hati 폴더를 프로젝트 루트로 이동했습니다. </li><li>이제 다음과 같이 작곡가.json 파일의 autoload psr4 속성에 항목을 추가하여 업데이트했습니다. { "autoload": { "psr-4": { "hati" : "hati /" } } }</li></ul></p><p>하지만 저는 실제로 Composer.json 파일의 자동 로더를 반영하도록 작곡가가 자동 로더를 재생성하도록 하는 방법을 모릅니다. 새로운 자동 로드 항목. 아래는 내 Installer 클래스입니다.
<pre class="brush:php;toolbar:false;"><?php
네임스페이스 hatiinstaller;
ComposerInstallerLibraryInstaller를 사용하십시오.
ComposerIOIOInterface를 사용하십시오.
ComposerPackagePackageInterface를 사용합니다.
ComposerPartialComposer를 사용하십시오.
ComposerRepositoryInstalledRepositoryInterface를 사용합니다.
ComposerScriptScriptEvents를 사용합니다.
haticonfigConfigWriter를 사용하십시오.
ReactPromisePromiseInterface를 사용하세요.
클래스 설치 프로그램은 LibraryInstaller {를 확장합니다.
개인 문자열 $root;
개인 문자열 $hatiDir;
보호된 $작곡가;
공개 함수 __construct(IOInterface $io, PartialComposer $composer, $root) {
$이것 -> 작곡가 = $작곡가;
$이것 -> 루트 = $루트 . DIRECTORY_SEPARATOR;
$이것 -> hatiDir = $root . DIRECTORY_SEPARATOR. '하티' . DIRECTORY_SEPARATOR;
parent::__construct($io, $composer);
}
공용 함수 getInstallPath(PackageInterface $package): 문자열 {
'rootdata21'을 반환합니다.
}
공용 함수 설치(InstalledRepositoryInterface $repo, PackageInterface $package): ?PromiseInterface {
if (file_exists($this -> hatiDir)) {
$선택 = $this -> io -> Ask('기존 hati 폴더를 찾았습니다. 삭제하시겠습니까? [y/n]: ', 'n');
if ($choice === 'y') {
self::rmdir($this -> hatiDir);
} 또 다른 {
$이것 -> io -> important('Hati 설치가 취소되었습니다. Hati 폴더를 수동으로 삭제해주세요.');
null을 반환;
}
}
return parent::install($repo, $package)->then(function () {
// hati 폴더를 프로젝트 루트 디렉터리로 이동합니다.
$old = $this -> 루트 . '루트데이터21'. DIRECTORY_SEPARATOR .'하티';
이름 바꾸기($old, $this -> hatiDir);
// rootdata21 폴더 삭제
self::rmdir($this -> 루트 . 'rootdata21');
// 프로젝트 루트 디렉터리에 hati.json 파일을 생성/업데이트합니다.
$createNewConfig = true;
if (file_exists($this -> root . 'hati.json')) {
동안(참) {
$ans = $this -> io -> Ask('기존 hati.json이 발견되었습니다. 새 구성과 병합하시겠습니까? [y/n]: ');
if ($ans !== 'y' && $ans !== 'n') 계속;
부서지다;
}
$createNewConfig = $ans == 'n';
}
require_once "{$this -> hatiDir}구성" . DIRECTORY_SEPARATOR . "ConfigWriter.php";
$result = ConfigWriter::write($this->root, $createNewConfig);
// 결과를 사용자에게 보여줌
if ($result['성공']) {
$이것 -> io -> info($result['msg']);
$welcomeFile = $this -> 하티디르 . '페이지/환영.txt';
if (file_exists($welcomeFile)) include($welcomeFile);
} 또 다른 {
$이것 -> io -> error($result['msg']);
}
$이것 -> 덤프자동로드();
});
}
공개 함수 업데이트(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) {
부모 반환::update($repo, $initial, $target) -> then(함수 () {
require_once "{$this -> hatiDir}config" . DIRECTORY_SEPARATOR. "ConfigWriter.php";
$result = ConfigWriter::write($this->root);
// 결과를 사용자에게 보여줌
if ($result['성공']) {
$이것 -> io -> info('Hati가 성공적으로 업데이트되었습니다.');
} 또 다른 {
$이것 -> io -> error($result['msg']);
}
});
}
공용 함수 지원($packageType): bool {
return 'hati-installer' === $packageType;
}
개인 함수 dumpAutoload(): void {
$composerJsonPath = $this -> 루트 . '작곡가.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 자동 로드 파일을 다시 생성합니다.
$이것 -> 작곡가 -> getEventDispatcher() -> dispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP);
}
공개 정적 함수 rmdir($dir): bool {
if (!file_exists($dir)) true를 반환합니다.
if (!is_dir($dir)) return unlink($dir);
foreach (scandir($dir)을 $item으로) {
if ($item == '.' || $item == '..') 계속;
if (!self::rmdir($dir . DIRECTORY_SEPARATOR . $item)) return false;
}
rmdir($dir)을 반환합니다.
}
}</pre>
<p><br /></p>