整合 Yeoman

每次執行產生器時,實際上你都使用 yeoman-environment。環境是一個基底系統,與任何 UI 元件分離,而且可以由任何工具抽象出來。執行 yo 時,基本上只在核心 Yeoman 環境上方執行一個終端 UI 外觀。

基礎知識

你需要知道的第一件事是環境系統包含在 yeoman-environment 套件中。你可以透過執行以下指令進行安裝:

npm install --save yeoman-environment

這個模組提供取得已安裝產生器、註冊和執行產生器的函式。它也提供使用者介面轉接器,供產生器使用。我們提供 完整的 API 文件(是一份簡潔的可用函式清單)。

使用 yeoman-environment

一個簡單的使用範例

在深入某個主題之前,我們先從一個 yeoman-environment 的簡單使用範例開始。

在這個範例中,我們假設 npm 要提供一個 npm init 指令來建立架構 package.json。閱讀文件中的其他頁面後,你已經知道如何建立產生器,因此我們假設我們已經有一個 generator-npm,我們會瞭解如何呼叫它。

第一步是建立一個新的環境實例。

var yeoman = require('yeoman-environment');
var env = yeoman.createEnv();

接著,我們要註冊 generator-npm,這樣稍後才能使用。你有兩種選擇:

// Here we register a generator based on its path. Providing the namespace
// is optional.
env.register(require.resolve('generator-npm'), 'npm:app');

// Or you can provide a generator constructor. Doing so, you need to provide
// a namespace manually
var GeneratorNPM = generators.Base.extend(/* put your methods in here */);
env.registerStub(GeneratorNPM, 'npm:app');

請注意你可以註冊任意數量的產生器。已註冊產生器只在環境中提供(例如允許組成)。

這時你的環境已經準備好執行 npm:app

// In its simplest form
env.run('npm:app', done);

// Or passing arguments and options
env.run('npm:app some-name', { 'skip-install': true }, done);

完成了。你只要將這段程式碼放入可執行 bin 檔案中,就可以在不使用 yo 的情況下執行 Yeoman 產生器。

尋找已安裝的產生器

但是,如果你希望提供存取權限給使用者電腦上每個安裝的 Yeoman 產生器,該怎麼辦?那麼你需要對使用者磁碟執行查詢。

env.lookup(function () {
  env.run('angular');
});

Environment#lookup() 會取得一個回呼,在 Yeoman 搜尋完已安裝的產生器後會呼叫它。每個找到的產生器會在環境中註冊。

如果發生命名空間衝突,區域產生器會覆寫全域產生器。

取得註冊產生器的資料

呼叫 Environment#getGeneratorsMeta() 將會傳回一個物件,說明查詢工作已註冊的元資料。

每個物件的鍵都是一個產生器命名空間,而值物件包含以下鍵:

  • resolved:產生器的解決路徑
  • namespace:產生器的命名空間

例如:

{
  "webapp:app": {
    "resolved": "/usr/lib/node_modules/generator-webapp/app/index.js",
    "namespace": "webapp:app"
  }
}

注意:使用 #registerStub() 註冊的產生器會將 "unknown" 作為 resolved 值。

提供自訂使用者介面 (UI)

Yeoman 使用轉接器作為抽象層,讓 IDE、程式碼編輯器等可以輕鬆提供執行產生器所需的使用者介面。

轉接器負責處理所有與使用者的互動。如果您想提供不同於傳統命令行的互動模式,您必須撰寫自己的轉接器。與使用者互動的每種方法都通過此轉接器(主要是:提示、記錄和差異)。

預設情況下,Yeoman 提供終端機轉接器。而我們的測試輔助程式提供測試轉接器,該程式會模擬提示並靜音輸出。您可以將這些用作您自己的實作的參考。

若要安裝轉接器,請使用yeoman.createEnv(args, opts, adapter)的第三個參數。

轉接器應至少提供三種方法。

Adapter#prompt()

它提供問題解答功能(例如,當您啟動yo時,會向使用者提示一組可能的動作)。它的簽名和行為遵循Inquirer.js的慣例。當產生器呼叫this.prompt時,最後會由轉接器處理呼叫。

Adapter#diff()

當遇到衝突且使用者要求顯示舊檔案和新檔案之間的差異時,會在內部呼叫(會將兩個檔案的內容傳遞為引數)。

Adapter#log()

它是一個函式和一個用於一般輸出的物件。請參閱lib/util/log.js以取得要提供的完整方法清單。

範例實作

以下是使用yeoman-environment的模組/外掛程式/應用程式清單。您可以將它們作為靈感。