天天看點

11、整合Yeoman

每次運作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 ”的使用。

在此示例中,假設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() 将傳回一個對象,該對象描述查找任務注冊的中繼資料。

每個對象鍵都是一個生成器名稱空間,值對象包含以下鍵:

  • resolved

    : generator的解析路徑
  • namespace

    : generator的命名空間

例如:

{
  "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()

它提供了問答功能(例如,當您開始時,會向使用者提示一系列可能的操作)。

它的簽名和行為遵循Inquirer.js的規定。

當生成器調用this.prompt時,該調用最終由擴充卡處理。

Adapter#diff()

在遇到沖突并且使用者要求新舊檔案之間進行區分時在内部調用(兩個檔案的内容均作為參數傳遞)。

Adapter#log()

它既是用于通用輸出的函數,又是對象。 有關提供的方法的完整清單,請參見lib/util/log.js。

11.4 Example implementations

這是使用yeoman環境的子產品/插件/應用程式的清單。

  • yo
  • yeoman-app

Yeoman系列

1 入門
2 建立Generator
3 Generator運作時上下文(Runtime Context)
4 使用者互動
5 可組合性
6 管理依賴
7 使用檔案系統
8 管理配置
9 單元測試
10 調試Generator
11 整合Yeoman