每次運作Generator時,實際上都是在使用yeoman環境。 該環境是與任何UI元件分離的基礎系統,并且可以由任何工具抽象化。 當運作yo時,基本上隻是在核心Yeoman環境之上運作終端UI外觀。
11.1 基礎
需要知道的第一件事是環境系統包含在yeoman-environment軟體包中。 可以通過運作以下指令進行安裝:
npm install --save yeoman-environment
該子產品提供了檢索已安裝的Generator,注冊和運作Generator的方法。它還提供了Generator正在使用的使用者界面擴充卡。提供了完整的API文檔(可用方法的簡要清單。)
11.2 使用 yeoman-environment
yeoman-environment
簡單使用的例子
讓我們從簡單的例子開始,我們在探讨更深層次的話題之前就開始了“yeoman-environment ”的使用。
在此示例中,假設npm想要通過npm init指令來封裝package.json。 閱讀文檔的其他頁面,已經知道如何建立Generator。是以,假設我們已經有一個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');
請注意,您可以根據需要注冊任意數量的Generator。 已注冊的Generator僅在整個環境中可用(例如,允許可組合性)。
至此,您的環境已準備就緒,可以運作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可運作檔案中,就可以運作Yeoman生成器,而無需使用yo。
查找安裝的Generator
如果希望提供對使用者計算機上安裝的每個Yeoman生成器的通路權限,該怎麼辦?那麼,需要執行使用者磁盤的查找。
env.lookup(function () {
env.run('angular');
});
在Yeoman完成搜尋已安裝的生成器後,Environment#lookup() 會調用一個回調。 找到的每個生成器都将在環境中注冊。
如果名稱空間沖突,本地生成器将覆寫全局生成器。
擷取有關注冊Generator的資料
調用Environment#getGeneratorsMeta() 将傳回一個對象,該對象描述查找任務注冊的中繼資料。
每個對象鍵都是一個生成器名稱空間,值對象包含以下鍵:
-
: generator的解析路徑resolved
-
: generator的命名空間namespace
例如:
{
"webapp:app": {
"resolved": "/usr/lib/node_modules/generator-webapp/app/index.js",
"namespace": "webapp:app"
}
}
注意:使用#registerStub() 注冊的生成器的解析值将為“未知”。
11.3 提供自定義的使用者接口(User Interface)
Yeoman使用擴充卡作為抽象層,以允許IDE,代碼編輯器等輕松提供運作生成器所需的使用者界面。
擴充卡是負責處理與使用者的所有互動的對象。 如果要提供與傳統指令行不同的互動模型,則必須編寫自己的擴充卡。 與使用者互動的每種方法都通過此擴充卡(主要是:提示,日志記錄和差異)。
預設情況下,Yeoman提供一個terminal。 測試助手會提供一個測試擴充卡,可以模拟提示并靜音輸出。 可以将它們用作自己的實作的參考。
要安裝擴充卡,請使用yeoman.createEnv(args,opts,adapter)的第三個參數。
擴充卡至少應提供三種方法:
Adapter#prompt()
Adapter#prompt()
它提供了問答功能(例如,當您開始時,會向使用者提示一系列可能的操作)。
它的簽名和行為遵循Inquirer.js的規定。
當生成器調用this.prompt時,該調用最終由擴充卡處理。
Adapter#diff()
Adapter#diff()
在遇到沖突并且使用者要求新舊檔案之間進行區分時在内部調用(兩個檔案的内容均作為參數傳遞)。
Adapter#log()
Adapter#log()
它既是用于通用輸出的函數,又是對象。 有關提供的方法的完整清單,請參見lib/util/log.js。
11.4 Example implementations
這是使用yeoman環境的子產品/插件/應用程式的清單。
- yo
- yeoman-app
1 | 入門 |
2 | 建立Generator |
3 | Generator運作時上下文(Runtime Context) |
4 | 使用者互動 |
5 | 可組合性 |
6 | 管理依賴 |
7 | 使用檔案系統 |
8 | 管理配置 |
9 | 單元測試 |
10 | 調試Generator |
11 | 整合Yeoman |