<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>
원하던 일을 성공적으로 이루었습니다. 그래서 여기서 제가 찾고 있는 도움에 대해 설명하겠습니다.
일반적으로 사용자 정의 설치 플러그인을 사용하지 않으면 Composer는 "rootdata21/hati"라는 공급업체 디렉터리에 패키지를 설치합니다. 하지만 어떤 이유로 전체 패키지 소스 코드가 프로젝트 루트에 있어야 합니다. 그리고 rootdata21이라는 상위 폴더도 갖고 싶지 않습니다.
그래서 저는 이것을 위한 플러그인을 작성했습니다. 플러그인은 설치 경로로 "rootdata21"을 반환합니다. 내 패키지를 루트 디렉터리에 넣지만 폴더 구조는 이제 "rootdata21/hati"가 됩니다. 따라서 이를 수정하려면 설치 방법을 재정의해야 했습니다. 그러나 "rootdata21/hati"에서 폴더를 복사/이름 변경/삭제하여 원하는 폴더 위치와 구조를 얻더라도 오토로더는 재배치된 소스 코드에서 여전히 작동하지 않습니다. 그런 다음 자동 로더를 재생성하기 위해 작곡가.json 파일을 수동으로 업데이트해야 했고, 이는 설치 프로그램의 목적을 무너뜨렸습니다. 이것이 제가 달성하고 싶은 것입니다. 패키지 폴더를 프로젝트 루트로 옮긴 후에도 오토로더가 여전히 제대로 작동한다는 것입니다.
이것은 내가 원하는 방식으로 작동하는 최종 업데이트된 설치 프로그램 코드입니다.
으아아아 으아아아이 모든 작업 후에는 스크린샷에서 볼 수 있듯이 Vendor/composer/autoload_psr4.php 파일에 클래스 경로가 올바르게 설정되어 있습니다.
"rootdata21"을 반환하고 위의 설치 코드를 사용하면 다음 autoload_psr4.php 레코드를 얻게 되어 제대로 작동하지 않기 때문에 설치 경로로 "hati"를 반환해야 했습니다.
으아아아