組成性

組成性是一種結合較小部分成為一個較大整體的方法。有點 像是無敵鐵金鋼

Yeoman 提供多種管道讓產生器建立在共同基礎上。沒有道理重寫相同的功能,因此提供了一個 API 來在其他產生器中使用產生器。

在 Yeoman 中,可以用兩種方法啟動組成性

  • 產生器可以決定將自己與另一個產生器結合(例如,generator-backbone 使用 generator-mocha)。
  • 終端使用者也可以啟動組成(例如,Simon 希望建立一個具備 SASS 和 Rails 的 Backbone 專案)。請注意:終端使用者啟動組成是一項已規劃的功能,目前尚未提供。

this.composeWith()

composeWith 方法讓產生器得以與另一個產生器(或子產生器)並行執行。如此一來,它可以用到其他產生器中的功能,而無需獨自處理所有事情。

在組合時,請別忘了 執行內容和執行循環。在給定的優先順序群組執行中,所有已組合的產生器都會執行該群組中的函式。之後,針對下一個群組重複此動作。產生器之間的執行順序與呼叫 composeWith 的順序相同,請參閱 執行範例

API

composeWith 採用兩個參數。

  1. generatorPath - 指向您要與之結合的產生器的完整路徑(通常使用 require.resolve())。
  2. 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"