EntryPoint e0a34904d71e4052b6e259cb1865fbf1
분야 | 플러그인 |
---|---|
장르 | 개발자 툴 |
게임버전 | 모든버전 |
API | 스피곳, 페이퍼 |
문제점
버킷 플러그인을 개발해본 경험이 있다면, plugin.yml 을 한 번은 만들어보셨을 텐데요, 만들어보니 어떠셨나요?
처음 몇 번은 괜찮지만 많이 만들다보면 꽤 반복적이고 지루한 영역입니다.
plugin.yml 은 우리가 반드시 만들어줘야만 할까요?
실제로 plugin.yml 에 들어갈 필수값인 main, name, version 은 프로젝트를 생성할 때 우리가 이미 지정해주었습니다.
- name 은 프로젝트의 이름으로 대체할 수 있습니다.
- version 은 maven 또는 gradle 프로젝트라면 기입해야 할 값입니다.
- main 은 JavaPlugin 을 상속해야 하기 때문에, 컴파일 때 알아낼 수 있습니다.
위처럼 plugin.yml 의 필수 정보에는 그다지 새로운 정보가 들어가는 것이 아님을 알 수 있습니다.
또한, Gradle 에서 spigot-api 를 불러오려면 repository 주소와 dependency 정보같은 아주 긴 내용이 들어가게 됩니다.
그렇다면, 위같은 반복적인 작업을 없애고, 각 플러그인의 고유 기능에만 집중할 수는 없을까요?
Spigradle
Spigradle 은 버킷 플러그인 개발을 위한 Gradle 플러그인으로, plugin.yml 을 자동으로 생성해주고 버킷과 관련된 repository 와 dependency 들의 짧은 표기를 제공합니다.
Spigradle 이 plugin.yml 에 자동으로 설정하는 것들:
- main: 플러그인의 메인 클래스를 프로젝트에서 자동으로 찾아줍니다.
- name: 지정한 프로젝트 이름
- version: 지정한 프로젝트 버전
따라서 plugin.yml 의 main, name, version 만을 사용하는 간단한 플러그인이라면, 단지 Spigradle 을 적용하는 것만으로도 별도의 작업없이 plugin.yml 이 생성됩니다.
만약 authors, commands 와 같은 추가 정보가 필요하다면 build.gradle 에서 자동완성의 도움을 받아 편하게 입력할 수 있습니다.
물론 main, name, version 을 수동으로 기입할 수 있으며, @Plugin 어노테이션으로 메인 클래스를 특정할 수도 있습니다. 컴파일 시 해당 어노테이션은 지워집니다.
spigot-annotation 을 사용하는 것과는 무엇이 다른가요?
- 첫 째, 버전 정보가 겹치지 않을 수 있습니다
spigot annotation 은 version 을 요구하는데, 이는 build.gradle 에 이미 있는 정보입니다 - 둘 째, 어노테이션은 많은 정보를 담기에 부적합한 디자인입니다.
만약 commands 나 permissions 같은 복잡한 정보를 써넣는다면 가독성이 떨어집니다. - 셋 째, Gradle 의 다이나믹함을 최대한 활용할 수 있습니다.
따라서 어떤 상황이 와도 융통성있게 대처할 수 있습니다.
플러그인 적용
Groovy:
plugins {
id("kr.entree.spigradle") version "1.2.1"
}
Kotlin:
plugins {
id("kr.entree.spigradle") version "1.2.1"
}
전체 예제
Groovy
plugins {
id 'java'
id 'kr.entree.spigradle' version '1.2.1'
}
group 'org.example'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
protocolLib()
jitpack() // For vault
}
dependencies {
compileOnly paper('1.15.1') // Or spigot()
compileOnly protocolLib()
compileOnly vault()
testImplementation 'junit:junit:4.12'
}
spigot {
authors = ['Me']
depends = ['ProtocolLib']
apiVersion = '1.15'
load = STARTUP
commands {
give {
aliases = ['i']
description = 'Give command.'
permission = 'test.foo'
permissionMessage = 'You do not have permission!'
usage = '/ [test|stop]'
}
}
permissions {
'test.foo' {
description = 'Allows foo command'
defaults = 'true'
}
'test.*' {
description = 'Wildcard permission'
defaults = 'op'
children = ['test.foo': true]
}
}
}
Kotlin
import kr.entree.spigradle.attribute.*
import kr.entree.spigradle.kotlin.*
plugins {
kotlin("jvm") version "1.3.70"
id("kr.entree.spigradle") version "1.2.1"
}
group = "org.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
protocolLib()
jitpack() // For vault
}
dependencies {
compileOnly(paper("1.15.1")) // Or spigot()
compileOnly(protocolLib())
compileOnly(vault())
testImplementation("junit:junit:4.12")
}
spigot {
authors = listOf("Me")
depends = listOf("ProtocolLib")
apiVersion = "1.15"
load = Load.STARTUP
commands {
create("give") {
aliases = listOf("i")
description = "Give command."
permission = "test.foo"
permissionMessage = "You do not have permission!"
usage = "/ [test|stop]"
}
}
permissions {
create("test.foo") {
description = "Allows foo command"
defaults = "true"
}
create("test.*") {
description = "Wildcard permission"
defaults = "op"
children = mapOf("test.foo" to true)
}
}
}
댓글이 없습니다.
새로운 댓글을 등록해 주세요!