개인 자료란 (JE)

  서버 커뮤니티

Profile EntryPoint 대표칭호 없음

EntryPoint e0a34904d71e4052b6e259cb1865fbf1

Profile

강좌 자바 에디션(JE) 플러그인 개발

Spigradle - 더이상 plugin.yml 을 수동으로 만들지 마세요!

2020.03.13 조회 수 1597 추천 수 2
분야 플러그인 
장르 개발자 툴 
게임버전 모든버전 
API 스피곳, 페이퍼 

Gradle

문제점

버킷 플러그인을 개발해본 경험이 있다면, 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)
}
}
}


Repositories

Dependencies


유용했다면 깃허브에서  Star 를 눌러주세요!

Warning
댓글이 없습니다.

새로운 댓글을 등록해 주세요!

뉴스 및 창작물
/files/thumbnails/150/925/003/262x150.crop.jpg?20241123005717

건축

응답하라 1988 ?

팀뉴일리시

2024-11-23

4

/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 5

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2

/files/thumbnails/219/899/003/262x150.crop.jpg?20241009200950

건축

송전탑+도시 2

dbasd12

2024-10-09

2

/files/thumbnails/246/898/003/262x150.crop.jpg?20241008102328

레드스톤

단다단 - 오토노케(オトノケ) | 마인크래프트 노트블럭 커버

노트블럭전문가

2024-10-08

1

/files/thumbnails/348/896/003/262x150.crop.jpg?20241006103035

디도스/봇테러등등을 낚는 방법 4

물귀신

2024-10-06

3

/files/thumbnails/839/895/003/262x150.crop.jpg?20241006021227

SRV레코드는 보안도메인이 아닙니다. [서버오픈시 필독]

물귀신

2024-10-05

4