From ea72051e43369efd08053c5b189dfc5a38ac133c Mon Sep 17 00:00:00 2001 From: claude-bot Date: Wed, 13 May 2026 23:51:13 +0900 Subject: [PATCH] =?UTF-8?q?installer:=20Fabric=20=EC=9D=B4=EB=AF=B8=20?= =?UTF-8?q?=EC=84=A4=EC=B9=98=EB=8F=BC=20=EC=9E=88=EC=9C=BC=EB=A9=B4=20fab?= =?UTF-8?q?ric-installer=20=EC=9E=AC=EC=8B=A4=ED=96=89=20=EA=B1=B4?= =?UTF-8?q?=EB=84=88=EB=9B=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상: 두 번째 설치 시도에서 fabric-installer 가 FileSystemException: ...fabric-loader-X-Y.jar: 다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다 로 실패. 마인크래프트(또는 OS 인덱서)가 jar 핸들을 잡고 있을 때 발생. 원인: fabric-installer 는 매 실행마다 versions//.jar 를 deleteIfExists 한 뒤 다시 쓰려고 한다. 이미 설치돼 있으면 굳이 다시 쓸 필요가 없다. 수정: installFabricLoader 에서 customRoot/versions//.jar 와 .json 이 둘 다 존재하면 곧바로 return 하고 안내 로그만 남긴다. --- locales/installer/ko-kr.json | 1 + src/installer/main.ts | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/locales/installer/ko-kr.json b/locales/installer/ko-kr.json index 3d3c08e..d4202b0 100644 --- a/locales/installer/ko-kr.json +++ b/locales/installer/ko-kr.json @@ -255,6 +255,7 @@ "javaUsed": "Java 사용: {{path}}", "fabricInstallStart": "Fabric 자동 설치 시작: {{mc}} / loader {{loader}} → {{dir}}", "fabricInstallDone": "Fabric 자동 설치 완료.", + "fabricAlreadyInstalled": "Fabric 이미 설치돼 있어 건너뜁니다: {{id}} ({{dir}})", "launcherProfilesMissing": "launcher_profiles.json을 찾을 수 없습니다: {{path}}", "javaArgsUpdated": "JVM 인수 갱신(메모리 + G1 GC 튜닝 추가): \"{{before}}\" → \"{{after}}\"", "lastVersionId": "launcher_profiles 의 lastVersionId = {{id}}", diff --git a/src/installer/main.ts b/src/installer/main.ts index a9528f0..526b789 100644 --- a/src/installer/main.ts +++ b/src/installer/main.ts @@ -1068,6 +1068,19 @@ async function installFabricLoader(pack: PackDefinition, customRoot: string): Pr throw new Error(t('errors.fabricLoaderRequired')) } + // 0) 이미 설치돼 있으면 건너뛴다. fabric-installer 는 매번 jar 를 지우고 + // 다시 쓰려고 시도해서, 마인크래프트나 다른 프로세스가 그 파일을 잡고 + // 있으면 FileSystemException 으로 실패한다. 결과 파일이 그대로 있으면 + // 재실행할 필요가 없으므로 그냥 통과. + const versionId = `fabric-loader-${loaderVersion}-${pack.mcVersion}` + const versionDir = path.join(customRoot, 'versions', versionId) + const versionJar = path.join(versionDir, `${versionId}.jar`) + const versionJson = path.join(versionDir, `${versionId}.json`) + if (fs.existsSync(versionJar) && fs.existsSync(versionJson)) { + sendLog(t('log.fabricAlreadyInstalled', { id: versionId, dir: versionDir })) + return + } + // 1) 최신 fabric-installer 메타데이터 조회. sendLog(t('log.fabricFetchInstallerList')) const installerList = await fetchJson('https://meta.fabricmc.net/v2/versions/installer')