組成性是一種結合較小部分成為一個較大整體的方法。有點 像是無敵鐵金鋼
Yeoman 提供多種管道讓產生器建立在共同基礎上。沒有道理重寫相同的功能,因此提供了一個 API 來在其他產生器中使用產生器。
在 Yeoman 中,可以用兩種方法啟動組成性
- 產生器可以決定將自己與另一個產生器結合(例如,
generator-backbone
使用generator-mocha
)。 - 終端使用者也可以啟動組成(例如,Simon 希望建立一個具備 SASS 和 Rails 的 Backbone 專案)。請注意:終端使用者啟動組成是一項已規劃的功能,目前尚未提供。
this.composeWith()
composeWith
方法讓產生器得以與另一個產生器(或子產生器)並行執行。如此一來,它可以用到其他產生器中的功能,而無需獨自處理所有事情。
在組合時,請別忘了 執行內容和執行循環。在給定的優先順序群組執行中,所有已組合的產生器都會執行該群組中的函式。之後,針對下一個群組重複此動作。產生器之間的執行順序與呼叫 composeWith
的順序相同,請參閱 執行範例。
API
composeWith
採用兩個參數。
generatorPath
- 指向您要與之結合的產生器的完整路徑(通常使用require.resolve()
)。options
- 執行組合產生器時要傳遞給它的選項的物件。
在與 peerDependencies
產生器結合時
this.composeWith(require.resolve('generator-bootstrap/generators/app'), {preprocessor: 'sass'});
require.resolve()
回傳 Node.js 會從中載入所提供的模組的路徑。
請注意:如果你需要將 arguments
傳遞給基於 yeoman-generator
舊於 1.0 版的產生器,你可以提供一個 Array
作為 options.arguments
金鑰。
儘管這並非鼓勵的做法,你也可以傳遞產生器命名空間給 composeWith
。在此情況下,Yeoman 將嘗試在終端使用者系統上的 peerDependencies
或全域中找到已安裝的產生器。
this.composeWith('backbone:route', {rjs: true});
使用產生器類別進行結合
composeWith
也可以將物件作為第一個引數。物件應該定義下列屬性
Generator
- 要組合的產生器類別path
- 產生器檔案的路徑
這將讓您從專案中定義的或從其他模組匯入的產生器類別組合起來。傳遞 options
作為 composeWith
的第二個引數,如預期般運作。
// Import generator-node's main generator
const NodeGenerator = require('generator-node/generators/app/index.js');
// Compose with it
this.composeWith({
Generator: NodeGenerator,
path: require.resolve('generator-node/generators/app')
});
執行範例
// In my-generator/generators/turbo/index.js
module.exports = class extends Generator {
prompting() {
this.log('prompting - turbo');
}
writing() {
this.log('writing - turbo');
}
};
// In my-generator/generators/electric/index.js
module.exports = class extends Generator {
prompting() {
this.log('prompting - zap');
}
writing() {
this.log('writing - zap');
}
};
// In my-generator/generators/app/index.js
module.exports = class extends Generator {
initializing() {
this.composeWith(require.resolve('../turbo'));
this.composeWith(require.resolve('../electric'));
}
};
執行 yo my-generator
後,會產生以下結果
prompting - turbo
prompting - zap
writing - turbo
writing - zap
您可以透過反轉 composeWith
的呼叫來變更函數呼叫順序。
請記住您可以透過 npm 上其他公開的產生器來組合。
若要查看組合性的更複雜範例,請查看 generator-generator,它是由 generator-node 組成的。
相依性或同儕相依性
npm 允許三種類型的相依性
dependencies
安裝到產生器的本機。控制使用的相依版本是最佳選項。這是偏好的選項。peerDependencies
安裝在產生器旁邊,作為同儕。例如,如果generator-backbone
宣告generator-gruntfile
為同儕相依性,資料夾樹狀圖會如下所示├───generator-backbone/ └───generator-gruntfile/
devDependencies
用於測試和開發公用程式。這不適用於這裡。
使用 peerDependencies
時,請注意其他模組可能也需要請求的模組。注意,不要透過請求特定版本(或特定版本的範圍)來產生版本衝突。Yeoman 對 peerDependencies
的建議永遠都是請求高於或等於 (>=) 或任何 (*) 可用版本。例如
{
"peerDependencies": {
"generator-gruntfile": "*",
"generator-bootstrap": ">=1.0.0"
}
}
注意:從 npm@3 開始, peerDependencies
不再自動安裝。若要安裝這些相依性,必須手動安裝: npm install generator-yourgenerator generator-gruntfile generator-bootstrap@">=1.0.0"