每次執行產生器時,實際上你都使用 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
的模組/外掛程式/應用程式清單。您可以將它們作為靈感。