自定義Yeoman生成器
生成器(腳手架都可以)是Yeoman生態(tài)系統(tǒng)中的重要組成部分氓英,yo通過插件的方式運行生成器,為終端用戶生成文件。
通過這篇文章剔桨,你將學(xué)會如何創(chuàng)建和發(fā)布自定義的生成器
組織你的生成器
創(chuàng)建node模塊
生成器本質(zhì)上就是一個node.js的模塊
首先腻暮、創(chuàng)建一個文件夾彤守,例如:generator-net。文件夾的命名必須是:generator-name(其中name就是你要自定義的生成器的名字)哭靖,這一點非常重要具垫,因為Yeoman就是根據(jù)文件系統(tǒng)去發(fā)現(xiàn)可用的生成器。
然后试幽,進(jìn)入到剛創(chuàng)建的文件夾:cd generator-net筝蚕,通過npm init 創(chuàng)建package.json文件,文件內(nèi)容如下:
注意:name必須是generator開頭铺坞,keywords屬性必須要包含“yeoman-generator”起宽,files屬性必須是一個文件和文件夾的數(shù)組項(具體參考文件結(jié)構(gòu)說明)
為了確保依賴項yeoman-generator是最新的,可以通過運行如下命令:npm install --save yeoman-generator
請參考package.json 說明給package.json添加其他需要的屬性
目錄結(jié)構(gòu)
Yeoman的功能依賴于如何去組織目錄結(jié)構(gòu)济榨。每一個子生成器也都有自己的目錄
當(dāng)你執(zhí)行yo name 命令時坯沪,使用的是app默認(rèn)的生成器,包含在app目錄下
輸入yo name:subcommand就是執(zhí)行子生成器擒滑,文件的目錄名和子生成器的名字一樣腐晾。
目錄結(jié)構(gòu)可以參考如下示例:
如圖的生成器就會提供yo net 和 yo net:subnet兩個命令
Yeoman提供了兩種不同的目錄結(jié)構(gòu)叉弦,會在generators目錄下注冊可用的生成器
上面的示例也可以采用如下的目錄結(jié)構(gòu):
但是必須要修改package.json文件中files的屬性為:
{"files": ["app","subnet"]}
編寫生成器
組織好了目錄結(jié)構(gòu),接下來就可以寫生成器相關(guān)的代碼了
Yeoman提供一個生成器的基類藻糖,該基類提供了大部分的功能淹冰,以減少我們的工作量,我們也可以繼承該基類去實現(xiàn)一些自定義的邏輯
修改生成器的index.js文件巨柒,引入yeoman-generator并繼承Generator基類:
具體怎么樣使用module.exports樱拴,可以參考exports 使用說明
重寫構(gòu)造函數(shù)
有些方法只能在構(gòu)造函數(shù)中執(zhí)行,例如:構(gòu)建一些狀態(tài)而且作用域在構(gòu)造函數(shù)中
我們可以按照如下的方式進(jìn)行構(gòu)造函數(shù)的重寫
添加自定義的功能
每一個被添加的方法都將按順序執(zhí)行潘拱。但是疹鳄,下一章節(jié)中,我們也能看到有些特殊的方法執(zhí)行順序也比較固定芦岂。
我們來添加一些方法:
執(zhí)行 yo net瘪弓,將看到如下的輸出信息:
執(zhí)行生成器
此時,你應(yīng)該有一個可以工作的生成器禽最,接下來腺怯,驗證一下創(chuàng)建的生成器是否能正常工作。
因為是在本地開發(fā)的生成器川无,所以還不是一個全局的node模塊呛占。可以通過命令npm link懦趋,去創(chuàng)建一個全局的node模塊并鏈接到我們開發(fā)的本地模塊晾虑。注意需要在生成器的根目錄下執(zhí)行命令:generator-name/ 目錄,執(zhí)行完命令之后仅叫,我們就能執(zhí)行命令:yo net并能在控制臺中看到輸出的日志信息
發(fā)現(xiàn)項目的根目錄
當(dāng)運行一個生成器時帜篇,Yeoman將試圖根據(jù)它運行的上下文推斷出一些東西。
最關(guān)鍵的是诫咱,Yeoman將在文件目錄中查找.yo-rc.json的文件笙隙,如果找到了,則把該文件所在的目錄當(dāng)作是項目的根目錄坎缭,Yeoman會自動在后臺更改當(dāng)前的目錄為.yo-rc.json文件所在的目錄并執(zhí)行生成器的請求竟痰。
.yo-rc.json文件是通過存儲模塊創(chuàng)建的。在生成器中只有第一次執(zhí)行的時候才會生成.yo-rc.json文件: