neoforge.mods.toml 메타데이터 이해
NeoForge 모드의 메타데이터 파일인 neoforge.mods.toml의 modId, displayName, version, dependencies 등 모든 필드를 이해합니다.
neoforge.mods.toml 메타데이터 이해
모드를 NeoForge에 등록하려면 neoforge.mods.toml 파일이 반드시 있어야 합니다. 이 파일은 모드의 이름, 버전, 라이선스, 의존성 등 모든 메타데이터를 담고 있으며, NeoForge 로더가 게임 시작 시 가장 먼저 읽는 파일입니다.
파일 위치
템플릿 프로젝트에서 이 파일은 다음 경로에 있습니다:
examplemod-template-26.1.2/
└── src/
└── main/
└── templates/
└── META-INF/
└── neoforge.mods.toml ← 여기
templates/ 폴더에 있는 이유가 있습니다. Gradle의 generateModMetadata 태스크가 빌드 시 이 파일을 읽어 ${mod_id}, ${mod_version} 같은 변수를 실제 값으로 치환한 뒤 src/main/resources/META-INF/에 복사합니다. 원본 파일을 직접 resources/META-INF/에 두면 변수 치환이 일어나지 않으니 주의하세요.
전체 파일 구조
# 최상위 필드
license="${mod_license}"
# 모드 블록
[[mods]]
modId="${mod_id}"
version="${mod_version}"
displayName="${mod_name}"
description='''
Example mod description.
'''
# 의존성 블록
[[dependencies.${mod_id}]]
modId="neoforge"
type="required"
versionRange="[${neo_version},)"
ordering="NONE"
side="BOTH"
[[dependencies.${mod_id}]]
modId="minecraft"
type="required"
versionRange="${minecraft_version_range}"
ordering="NONE"
side="BOTH"필드 전체 정리
최상위 필드
| 필드 | 필수 | 설명 | 예시 |
|---|---|---|---|
modLoader | 필수 | 모드 로더 식별자 | "javafml" |
loaderVersion | 필수 | 지원하는 로더 버전 범위 | "[4,)" |
license | 필수 | 모드 라이선스 | "MIT", "ARR" |
issueTrackerURL | 선택 | 버그 리포트 URL | "https://github.com/..." |
참고:
modLoader와loaderVersion은 템플릿 파일에 주석 처리되어 있지만, NeoForge가 내부적으로 기본값을 적용합니다. 명시적으로 작성하면 의도를 더 명확히 할 수 있습니다.
[[mods]] 블록 필드
| 필드 | 필수 | 설명 | 예시 |
|---|---|---|---|
modId | 필수 | 모드 고유 식별자 | "examplemod" |
version | 필수 | 모드 버전 | "1.0.0" |
displayName | 필수 | 게임 내 표시 이름 | "Example Mod" |
description | 필수 | 모드 설명 (여러 줄 가능) | '''설명...''' |
logoFile | 선택 | JAR 루트 기준 로고 파일 경로 | "examplemod.png" |
credits | 선택 | 크레딧 텍스트 | "Thanks to..." |
authors | 선택 | 제작자 이름 | "YourName" |
displayURL | 선택 | 모드 홈페이지 URL | "https://..." |
updateJSONURL | 선택 | 업데이트 확인 JSON URL | "https://..." |
[[dependencies.<modId>]] 블록 필드
| 필드 | 필수 | 설명 | 값 |
|---|---|---|---|
modId | 필수 | 의존하는 모드의 ID | "neoforge", "minecraft" |
type | 필수 | 의존성 종류 | required, optional, incompatible, discouraged |
versionRange | 필수 | 허용 버전 범위 (Maven 범위 표기) | "[26.1.0,)" |
ordering | 선택 | 로드 순서 | NONE, BEFORE, AFTER |
side | 선택 | 적용 사이드 | BOTH, CLIENT, SERVER |
reason | 선택 | 의존성 이유 설명 | "필수 API 제공" |
변수 치환 이해하기
${mod_id}, ${mod_version} 같은 표현은 gradle.properties에 정의된 값으로 치환됩니다.
gradle.properties:
mod_id=examplemod
mod_name=Example Mod
mod_version=1.0.0
mod_license=MIT
neo_version=26.1.2.64-beta
minecraft_version_range=[1.21.5,1.22)neoforge.mods.toml (치환 전):
modId="${mod_id}"
version="${mod_version}"빌드 후 src/main/resources/META-INF/neoforge.mods.toml (치환 후):
modId="examplemod"
version="1.0.0"이 방식 덕분에 버전을 바꿀 때 gradle.properties 한 곳만 수정하면 됩니다.
modId 규칙
modId는 NeoForge 생태계에서 모드를 식별하는 유일한 키입니다. 규칙을 어기면 모드가 로드되지 않습니다.
허용: 소문자 영문자 a-z, 숫자 0-9, 밑줄 _
금지: 대문자, 공백, 하이픈, 특수문자
올바른 예:
modId="my_awesome_mod"
modId="neoforge_tutorial"
modId="examplemod"잘못된 예:
modId="MyAwesomeMod" # 대문자 금지
modId="my-mod" # 하이픈 금지
modId="my mod" # 공백 금지⚠️ 잘못된 modId 사용 시 modId에 대문자/공백 사용 시 모드 로드 실패:
Caused by: net.neoforged.fml.ModLoadingException: invalid mod ID반드시 lowercase a-z, 0-9, _ 만 사용
의존성 type 상세
| type | 동작 |
|---|---|
required | 해당 모드가 없으면 게임 시작 불가 |
optional | 없어도 되지만 있으면 연동 기능 활성화 |
incompatible | 해당 모드가 있으면 게임 시작 불가 |
discouraged | 해당 모드가 있으면 경고 표시 (시작은 가능) |
versionRange 표기법
Maven 버전 범위 표기를 사용합니다:
| 표기 | 의미 |
|---|---|
[26.1.0,) | 26.1.0 이상 모든 버전 |
[26.1.0,26.2.0) | 26.1.0 이상 26.2.0 미만 |
[26.1.0] | 정확히 26.1.0만 |
(26.0.0,) | 26.0.0 초과 모든 버전 |
[ ]는 포함(inclusive), ( )는 미포함(exclusive)입니다.
프로젝트 트리에서 파일 확인
전체 흐름 요약
gradle.properties neoforge.mods.toml (templates/)
│ │
│ ${mod_id} = examplemod │
└──────────────────────────────►
│ generateModMetadata 태스크
▼
src/main/resources/META-INF/neoforge.mods.toml
(변수 치환 완료, JAR에 포함됨)
│
▼
NeoForge 로더가 읽어 모드 등록
다음 단계
neoforge.mods.toml의 구조를 이해했으니, 다음 챕터에서는 실제 모드 진입점인 ExampleMod.java의 @Mod 어노테이션과 이벤트 버스 등록 방법을 살펴봅니다.
💡 Mods 메뉴에서 확인하기 모드를 빌드하고
runClient로 게임을 실행한 뒤 타이틀 화면의 Mods 버튼을 클릭하면displayName,version,description,authors필드가 실제로 표시되는 것을 확인할 수 있습니다. 인게임 캡처는 04-run-client 챕터를 참조하세요.