FGOW

计算机行业一直盛传着Unix哲学,它代表着一种程序设计风格,其中一条是"只做一件事并把它做好".在互联网时代,我倒希望那些互联网巨头(特别是@BAT)也能学学Unix哲学...不要一味地扩展业务领域,强行推广自己的垃圾服务毒害消费者...

好吧扯远了,ForgeGradle毫无疑问是个小而精的工具,然而它仍有一些不尽人意的地方,于是便有了ForgeGradle on Wall (简称FGOW)来为FG添砖加瓦,"做一些有违于LexManos和AbrarSyed哲学的事情".

1.概述

FGOW目前包含如下功能:
自定义下载源,包括Maven仓库和MC资源文件的下载地址.
构建可编辑MC源代码的开发目录,主要用于Coremod开发啥的...

当前版本:
1.1.0(用于1.7.2~1.8.0老版(下载地址显示Src)的ForgeGradle1.2)
1.2.0(用于1.8.0新版(下载地址显示MDK)的ForgeGradle2.0)
1.2.1(用于1.8.8~1.8.9的ForgeGradle2.1)

下载地址:
1.1.0
SkyDrive:http://1drv.ms/1HJPBBj
Dropbox:https://www.dropbox.com/s/xld5pviki13ju26/fgow-1.1.0.jar?dl=0
百度网盘:http://pan.baidu.com/s/1pJiNKan
1.2.0
SkyDrive:https://onedrive.live.com/redir?resid=856A4664427BE4F2!6007&authkey=!AG0N0Xk45x_H8Ns&ithint=file%2cjar
Dropbox:https://www.dropbox.com/s/4eajvu8vcweg0fs/fgow-1.2.0.jar?dl=0
百度网盘:http://pan.baidu.com/s/1qWxMVG4
1.2.1
SkyDrive:http://1drv.ms/21gcxy5
Dropbox:https://www.dropbox.com/s/ekig3gjx32uz3qp/fgow-1.2.1.jar?dl=0
百度网盘:http://pan.baidu.com/s/1geoIkin

安装方法:

1.1.0


(以下截图为旧版,新版也一样,只不过把"fgow-1.0.0.jar"中的"1.0.0"替换成相应的版本号)
将fgow-1.1.0.jar放到你的Forge目录下,与build.gradle同级.
20140726063207
用任意一款文本编辑器(但不建议用记事本!实在不行的话,用写字板打开也行)编辑build.gradle,在buildscript块的dependencies中加入:
classpath files('fgow-1.1.0.jar')
然后将下方的
apply plugin: xxx(具体内容与你使用的版本有关,但大体格式就是这样)
改为
apply plugin: 'fgow'
20140726063545
于是便安装完成了,打开cmd输入gradlew.bat tasks来验证一下是否安装成功
20140726063850

1.2.X


将fgow-1.2.0.jar(或fgow-1.2.1.jar)放到你的Forge目录下,与build.gradle同级.
fgow120
用任意一款文本编辑器(但不建议用记事本!实在不行的话,用写字板打开也行)编辑build.gradle.你会看到两部分:

buildscript {
    repositories {
        jcenter()
        maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:2.0-SNAPSHOT'
    }
}
apply plugin: 'net.minecraftforge.gradle.forge'
plugins {
    id "net.minecraftforge.gradle.forge" version "2.0.1"
}

根据你使用的版本,其中一部分是被注释掉的,而另一部分则没有.无论你现在看到的是什么样,你需要确保第一部分(也就是很长的那一段)没有注释,然而删掉/注释掉第二部分(只有3行的那段),说白了,就是留下长的,删掉短的,确保长的没有注释.
然后在buildscript块的dependencies中加入:(如果是1.2.1别忘了改一下)
classpath files('fgow-1.2.0.jar')
最后将下方的
apply plugin: 'net.minecraftforge.gradle.forge'
改为
apply plugin: 'fgow'
fgow120b

顺便一提,你可以将buildscript块中的repositories替换为以下来加速配置:

repositories {
        maven {
            name = "forge"
            url = "http://forgemavenmirror.sinaapp.com/maven"
        }
    }

关于配置的优化不在本篇范围,具体可以见:高速构建ForgeGradle

2.自定义下载源

有些人的网络与Forge的文件服务器和亚马逊的S3文件服务器的链接并不好,而ForgeGradle又不允许自定义下载源(你说build.gradle里的源?那个仅限于解析脚本时使用...).而Gradle这屌逼玩意又偏爱联网(当然你可以使用--offline(2个横杠)来禁止联网^ ^),因此FGOW引入了自定义下载源的功能,允许使用者将原下载源替换为ForgeMavenMirror或bangbang93的BMCLAPI2.

默认情况下,FGOW使用的和Forge相同的源设定,除了获取素材索引(AssertIndex)时使用Http而不是Https(垃圾回收党很讨厌秘密,我这里所有到S3的Https链接一律会被掐死).

下载源共分为有三类,分别是Minecraft的相关文件、ForgeGradle的Maven仓库、MCP与Forge的版本信息.

Minecraft的相关文件包括Minecraft的版本信息Json、客户端与服务器端文件、素材文件.默认情况下它们都是从Mojang在S3上的服务器下载,然而下载速度并非十分理想,因此FGOW允许你修改这部分的下载地址.
要自定义Minecraft文件下载源,编辑build.gradle,在apply plugin:'fgow'的下方加入repos块,可选的参数包括:

参数 作用 默认值
mcJsonUrl MC版本信息Json的下载地址,{MC_VERSION}为MC版本. "http://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/{MC_VERSION}.json"
mcClientUrl MC客户端下载地址,{MC_VERSION}为MC版本. "http://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/{MC_VERSION}.jar"
mcServerUrl MC服务器下载地址,{MC_VERSION}为MC版本. "http://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/minecraft_server.{MC_VERSION}.jar"
assestIndexUrl 资源索引下载地址,{ASSET_INDEX}为索引文件名. 1.7.2请暂时先使用默认的官方地址. "http://s3.amazonaws.com/Minecraft.Download/indexes/{ASSET_INDEX}.json"
assestUrl MC资源文件下载地址. "http://resources.download.minecraft.net"
mcpUrl 只用于1.1.0和1.2.0过去是MCP的反编译工具文件下载地址,从15年年末起,ForgeGradle工作组开始制作FernFlower2.0,因此它由一个小工具晋升为一个附属项目,从ForgeGradle2.1开始,就不需要特意下载了,所以这个选项仅针对FGOW1.1.0和1.2.0有效,1.2.1下使用不报错但也不会生效. "http://files.minecraftforge.net/fernflower-fix-1.0.zip"

fgow1103

几个推荐的配置包括:

国外源:

repos {
mcJsonUrl = "http://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/{MC_VERSION}.json"
mcClientUrl = "http://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/{MC_VERSION}.jar"
mcServerUrl = "http://s3.amazonaws.com/Minecraft.Download/versions/{MC_VERSION}/minecraft_server.{MC_VERSION}.jar"
assestIndexUrl = "http://s3.amazonaws.com/Minecraft.Download/indexes/{ASSET_INDEX}.json"
assestUrl = "http://resources.download.minecraft.net"
mcpUrl = "http://files.minecraftforge.net/fernflower-fix-1.0.zip"
}

这个就是默认配置...和什么都不写等效.

国内源:

repos {
mcJsonUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/{MC_VERSION}.json"
mcClientUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/{MC_VERSION}.jar";
mcServerUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/minecraft_server.{MC_VERSION}.jar";;
assestIndexUrl = "http://bmclapi2.bangbang93.com/indexes/{ASSET_INDEX}.json";
assestUrl = "http://bmclapi2.bangbang93.com/assets"
mcpUrl = "http://forgemavenmirror.sinaapp.com/fernflower-fix-1.0.zip"
}

这个是纯国内源,使用bangbang93的BMCLAPI2所有文件都从国内下载,毫无疑问速度是最快的,当然,偶尔你会发现国内源下载反而卡死的现象,那是因为BMCLAPI2太火了...偶尔会被下爆,这时候你可以稍等片刻(10m~10h ?)再去尝试,或者先暂时改回国外源,毕竟在大部分地区S3在http下还是有速度的.

 

ForgeGradle的Maven仓库即构建项目时所需要的库的下载地址(不要把项目的仓库源和buildscript内的仓库源搞混了,buildscript中的repositories里的仓库源只在初始化构建脚本时起作用,FGOW负责修改的是构建项目时用的仓库源).
如果你用过老版FGOW的话,你会知道过去这部分也是在repos块中设定的,因为老版的做法是在保持ForgeGradle默认源顺序的情况下只修改其地址,但在新版的开发过程中我逐渐认识到适当修改源的顺序对提高构建速度也起到了重要作用,因此在这里我干脆去掉了默认的仓库配置,改为用户自行配置.
配置ForgeGradle的Maven仓库源的方式和正常配置项目仓库源的方式相同,即在gradle.build中加入:
repositories {
...
}

关于如何写Gradle的repositories的文章有很多,上网搜一下即可(实在不行模仿buildscript中的repositories写也行),这里主要说明如何写ForgeGradle的源.
原版ForgeGradle的仓库源包括如下四个:

Forge仓库(http://files.minecraftforge.net/maven)
Maven主仓库
Minecraft仓库(https://libraries.minecraft.net/)
本地Forge缓存目录(Win7/8下是C:\Users\[用户名]\.gradle\caches\minecraft\net\minecraftforge\forge\[MC版本]-[Forge版本]\)

如果你没有写自定义的repositories的话,FGOW会保留默认仓库配置不做变化,如果你在gradle.build中为项目写了自定义的repositories的话,FGOW会移除默认的4个源.这意味着你要么不写,要么就完全由自己来写.
此外还有一个特殊的规则,"本地Forge缓存目录"如果你没有写的话,FGOW会自动为你补上,位置为最后一个.(Gradle在解析Maven仓库源时是按从上到下的顺序来),如果你希望自己写的话,就在repositories中添加一个:

flatDir { name = "local" } //FGOW1.1
flatDir { name "local"; dirs "/" } //FGOW1.2.X

FGOW会自动把它指向到Forge缓存目录的位置.1.2与1.1的写法不同是因为新版Gradle取消了本地仓库的默认地址了,因此需要临时添加一个假地址,然后由FGOW将它替换成实际地址.

fgow1104

推荐的配置方案是:

默认方案

repositories {
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
}
mavenCentral()
maven {
name = "minecraft"
url = "https://libraries.minecraft.net/"
}
flatDir { name = "local"; dirs "/" }
}

和ForgeGradle的默认方案等效,没有加速效果,仅供参考.

FMM加速

repositories {
flatDir { name = "local"; dirs "/" }
maven {
name = "forge"
url = "http://forgemavenmirror.sinaapp.com/maven"
}
}

速度最快的方案.

BMCLAPI2加速

repositories {
flatDir { name = "local"; dirs "/" }
mavenCentral()
maven {
name = "forge"
url = "http://bmclapi2.bangbang93.com/maven"
}
maven {
name = "minecraft"
url = "http://bmclapi2.bangbang93.com/libraries"
}
}

速度也很快,但稳定性较差,有可能会构建失败或卡死...

(注:过去我们还可以使用开源中国(OSChina)的Maven中国镜像替换掉Maven中央源来进一步加速,但这几天那个镜像因为OSC财力匮乏而被关闭了...不过说实话,那个镜像的速度和稳定性都实在是不敢恭维 → →)
现在OSChina的Maven主仓库镜像已经重开了,你可以通过将
mavenCentral()
改为
maven {
name = "maven"
url = "http://maven.oschina.net/content/groups/public/"
}

来启用OSChina的镜像.

 

MCP与Forge的版本信息分别是两个Json文件,虽然都不大,但卡起来时都很要命,因此FGOW从1.1.0开始新增了这两个文件的自定义下载源.

修改这两个文件的下载位置的办法是在apply plugin:'fgow'的前面添加这两行:

ext.mcpJsonUrl = "http://forgemavenmirror.sinaapp.com/versions.json"
ext.forgeJsonUrl = "http://forgemavenmirror.sinaapp.com/maven/net/minecraftforge/forge/json"

fgow1105

这样这两个文件就会从FMM的缓存上下载了.

ForgeGradle2.0又多了个用于版本检查的文件:ForgeGradleVersion.json,它的下载地址是"https://www.abrarsyed.com/ForgeGradleVersion.json".FGOW1.2也支持修改它的下载地址,然而现在并没有卵用,因为它没有镜像源(我在FMM上怎么也抓不下来它的文件...各种502,然而在浏览器中却能正常下载,难道它会检查UA或IP?),因此我还增加了一个选项就是跳过版本检查,大老远地去访问地球另一面的网站只为了检查自己用的ForgeGradle版本过没过期的话太不值当了.修改方式和上面那两个类似:

ext.fgVersionUrl = [镜像地址,如果有的话] //自定义下载源
ext.skipFGVersionCheck = true //跳过版本检查

 

3.经典开发目录

注意:这个功能只存在于1.1中,从1.2开始这个功能被移除了,因为它不够稳定,而且RecursiveG提出了一个更好的解决方案:利用类加载顺序.由于在IDE中调试时会优先加载项目中的类,再加载库中的类,因此如果你想修改哪个Minecraft代码的话,就在项目中新建一个同名包再新建一个同名类,然后把代码完整拷过去并修改.

过去我们都习惯一个说改就改的代码,但在ForgeGradle中没法这么做,LexManos又明确说过绝不会在FG中引入"构建可编辑的工作目录"之类的功能...于是便有了"有违于LexManos哲学"的FGOW.

FGOW提供了如下和构建经典开发目录相关的task

名称 描述
ForgeGradle setupClassicWorkspace DevWorkspace的全部功能 + MC源代码被部署入源代码目录.不会覆盖已有的文件.
Classic Workspace cleanClassic 近似于setupClassicWorkspace的逆向,从源码目录移除所有未被修改的MC源代码和资源文件.
Classic Workspace pickClassic 从源码目录中筛选出新文件以及被修改过的MC文件,并复制入build/picked.每次复制时都会清空build/picked/main和resources.

这个没啥好说的了...都懂得.

20140726054939

另外,src/main/java和resources下会加入3个文件,classic.projectmark用于标记这是个经典开发目录,sourceRecord.buildignore和resourcesRecord.buildignore用于记录文件MD5,跟踪是否文件是否发生变更.

====================谜の分割线=================

目前已知Bug:
对于经典开发目录,通过runClient/runServer运行游戏可能有无法加载某些资源文件的Bug,建议在IDE中运行.

未来计划:
Sub-projects Helper:子项目辅助功能 (生无可恋)
Sync Helper:文件同步  (估计不会有了)
一个Gui界面,提供一些功能的封装,为拉低人类平均智商而设计. (可能会被取消)
大量的,关于紫sama蓝sama幽幽sama觉sama恋sama和玛艾露贝莉x莲子的福利

现已在Github上开源: https://github.com/szszss/FGOW

建议先在白板FG上使用.如果是在已经有代码的FG上使用的话...记住:备份是金