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上使用的話...記住:備份是金