hogepiyo

かつてはマイクラのModを作っていたがひざに矢を受けた

IDEA+Gradleでわいわい

IDEAについて

Eclipseと同じIDE(統合開発環境)で, 正式名称は「IntelliJ IDEA」.
IntelliJ IDEA — The Best Java and Polyglot IDEからDLできる. Ultimate Edition(有料)とCommunity Edition(無料)がある.
Eclipseと違って日本語化されていないので注意. 解説等も英語のままが多かったので, 自分も日本語化はしていない.

Gradleについて

Forgeさんが導入したビルドツールもといビルドスクリプト. ビルド時に必要な情報をわっしわっしスクリプトに書いておくと自動でそれらのことをやってくれる. AntやMavenを内部から呼び出せるのでそっちでやってた人は移行も簡単.

(今までの)自分の開発環境

EclipseでのModdingはForgeが用意したワークスペースのsrcフォルダに直接ソースコードを入れて, bin/assetsにリソースを入れて開発していた. そのためMCPのコマンドでreobf.batをやると, reobfフォルダに追加したクラスファイルが全部出力される(パッケージを分けていても).

+ reobf
  + rgn
    + mods
      + dwarventools
      + elventools
      + toolrack

Modとして配布する際, このクラスファイルとリソースを分けてアーカイブにするわけだけど, 数が増えると面倒になった(なので, pythonスクリプトで自動で分別してアーカイブ化させてた).
更にいうと, getchangedsrcで出力したソースをgithubのローカルリポジトリに移してコミットしてたり・・・とにかく"手間が多かった".

IDEA+Gradle+Github

IDEAはデフォルトでGradleがIDEから使える. またgitにも対応しているので, msysGitなどをインストールしてgithubに接続すればIDEAから直接コミットできる.
加えてForgeGradleのbuildを実行すれば, ソースフォルダとリソースフォルダにあるものをコンパイルしてアーカイブ化してくれる. これを利用しない手はない.

ForgeGradleの導入

IntelliJ IDEA+gradleでもぢんぐ環境整える(Forge964) - nk0t's diaryを参考にIDEAで導入した. なおこれだけでもEclipseよりIDEAのほうが簡単だったりする(EclipseはGradleにデフォルトで対応していないのでプラグインを導入する必要がある).

ForgeGradleの仕様

インストール後のフォルダ階層を見れば一目瞭然だ. Modのソースとリソースはsrc/main/javaとsrc/main/resourcesにおけばいい. ビルド(MCPのreobf相当)はコンソールでForgeをインストールしたフォルダに移動して以下のコマンドを叩けばいい.

gradlew build

これを実行するとbuild/libsにアーカイブ化されたjarファイルが生成される.

マルチプロジェクト

ここからが本題. 上記の方法ではsrc/main/java&resourcesのものしかビルドされないし, 複数のModのソースをいれても1つのjarに入れられてしまう.
[How-To]Build multiple separate projects with Gradleという記事があったのでそれを試したってワケ.

上記記事はEclipse向けだったので, IDEAで色々つまづいた. なので出来たこと/やったことを手短にまとめる.

1. Modを子プロジェクトとして追加する

rootディレクトリ(名前を変えてないならforge-1.6.4-9.11.1.964-src, srcとかgradleとかeclipseとかいうフォルダがあるとこ)にsettings.gradleというファイルを以下の内容で追加する.
(もちろん名前は任意)

include 'modname'

次にrootディレクトリ内にmodnameフォルダを作成し, 以下のようなフォルダ構成にする.

+- root
   +- modname
      +- src
         +- main
            +- java
            +- resources

次にrootディレクトリにあるbuild.gradleを開き, 以下のようにする.

buildscript {
    repositories {
        mavenCentral()
        maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:1.0-SNAPSHOT'
    }
}

allprojects {
    apply plugin: 'forge'

    minecraft {
        version = "1.6.4-9.11.1.964"
    }

    version = "1.0"

    archivesBaseName = project.projectDir.name
}

processResources
{
    // replace stuff in mcmod.info, nothing else
    from(sourceSets.main.resources.srcDirs) {
        include 'mcmod/info'
                
        // replace version and mcversion
        expand 'version':project.version, 'mcversion':project.minecraft.version
    }
        
    // copy everything else, thats not the mcmod.info
    from(sourceSets.main.resources.srcDirs) {
        exclude 'mcmod.info'
    }
}

中央のallprojects~以外はデフォルトのまま.

次にmodnameフォルダの中に新しいbuild.gradleを以下の内容で作成する.

tasks.withType(Compile) {
    options.encoding = 'UTF-8'
}

sourceSets.main {
    java.srcDirs project.projectDir.name
    resources.srcDirs project.projectDir.name
}

version = "0.0.0"

ここでは2つのbuild.gradleがあることに注意.

+- root
   +- build.gradle
   +- modname
      +- build.gradle
      +- src
         +- main
            +- java
            +- resources

なお, 後者のbuild.gradleのencoding = 'UTF-8'は日本語を含むソースコードの場合必要. 英語のみなら必要ない. versionはアーカイブのファイル名に利用される. アーカイブのファイル名はmodname-verison.jarになる.

この状態でビルドするとmodname/build/libsにmodnameのアーカイブが生成される.

おわり

ざっくりだけど, Eclipseでがやがややるよりもスマートに出来るような気がする. 特にgradleのスクリプトをがりがり書いたわけではない. ちょっと追加しただけ. またgradleには生成されたjarファイルを自動でサーバーにアップロードすることもできる模様. FMLやForgeはそうしているようだ.