Fun Init 自定義模板
首先介紹下在本文出現的幾個比較重要的概念:
__函式計算(Function Compute)__: 函式計算是一個事件驅動的服務,通過函式計算,使用者無需管理伺服器等執行情況,只需編寫程式碼並上傳。函式計算準備計算資源,並以彈性伸縮的方式執行使用者程式碼,而使用者只需根據實際程式碼執行所消耗的資源進行付費。函式計算更多資訊參考。
__Fun__: Fun 是一個用於支援 Serverless 應用部署的工具,能幫助您便捷地管理函式計算、API 閘道器、日誌服務等資源。它通過一個資源配置檔案(template.yml),協助您進行開發、構建、部署操作。Fun 的更多文件 ofollow,noindex" target="_blank">參考 。
2.0 版本的 Fun,在部署這一塊做了很多努力,並提供了比較完善的功能,能夠做到將雲資源方便、平滑地部署到雲端。但該版本,在本地開發上的體驗,還有較多的工作要做。於是,我們決定推出 Fun Init 彌補這一處短板。
__Fun Init__: Fun Init 作為 Fun 的一個子命令存在,只要 Fun 的版本大於等於 2.7.0,即可以直接通過 fun init
命令使用。Fun Init 工具可以根據指定的模板快速的建立函式計算應用,快速體驗和開發函式計算相關業務。官方會提供常用的模板,使用者也可以自定自己的模板。
模板專案目錄結構
helloworld① 模板專案根目錄 ├── metadata.json② 模板專案配置檔案 └── {{ projectName }}③ 模板根目錄 ├── index.js └── template.yml
說明:
- ① 模板專案目錄。如果模板專案需要上傳到 github,則模板專案名稱就是倉庫名稱
- ② 模板專案配置檔案。模板專案配置檔案不是必須的,支援兩種型別的檔案:metadata.json 和 metadata.js
-
③ 模板根目錄。
fun init
會從模板根目錄開始渲染輸出,該目錄必須是一個模板表示式。projectName
模板變數來自fun init --name foo
的--name
引數。絕大多數場景,模板根目錄叫{{ projectName }}
即可
模板專案配置檔案
JSON 風格配置檔案
{ "name": "helloworld",① 模板專案名稱 "description": "Print hello world",② 模板專案描述 "userPrompt": [③ 提示輸入變數(顯式變數) { "type": "input",④ 提示輸入型別 "name": "foo",⑤ 模板變數名 "message": "Please input foo?",⑥ 提示資訊 "default": "{{ projectName }}"⑦ 模板變數預設值 }, { "type": "list", "name": "bar", "message": "Please select bar?", "default": "option1", "choices": ["option1", "option2", "option3"] } ], "vars": {⑧ 隱式變數 "baz": "{{ projectName }}" }, "copyOnlyPaths": [ "**/test" ]⑨ 設定某些目錄和檔案不需要渲染,只是簡單的拷貝 }
說明:
- ① 模板專案名稱。對模板專案簡單介紹
- ② 模板專案描述。對模板專案詳細介紹
-
③ 提示輸入變數(顯式變數)。在使用者初始化模板專案的時候,會顯式提示使用者輸入模板變數,底層用的是Inquirer
,④、⑤、⑥ 和 ⑦ 詳情可以參考:Inquirer 文件
。當通過
fun init --var foo=xxx
設定了foo
變數後,則不會再提示使用者輸入foo
變數的值,其他沒有設定過的顯式變數仍然提示輸入 -
⑧ 隱式變數。相對顯式變數而言,隱式變數不提示使用者輸入,可以通過
fun init --var baz=xxx
覆蓋配置檔案的隱式變數,如果顯式和隱式有相同的變數,則該變數不會再提示使用者輸入,但是這種方式是不推薦使用的,也不要依賴此特性,即顯式變數和隱式變數不要有交叉 -
⑨ 設定某些目錄和檔案不需要渲染,只是簡單的拷貝。比如一些二進位制檔案。格式和
gitignore
是一樣的,具體可以參考:gitignore 規範 -
配置檔案也可以使用變數,其中,
projectName
模板變數來自fun init --name foo
的--name
引數,還可以使用fun init --var abc=xxx
中的abc
變數,但是,如果你不通過--var
傳abc
變數,在渲染配置檔案的時候,可能報變數未定義的錯誤,可以在使用的時候先判斷一下,如:{{ typeof x === 'undefined'? '' : x}}
JS 風格配置檔案
module.exports = { name: 'helloworld',① 模板專案名稱 description: 'Print hello world',② 模板專案描述 userPrompt: [③ 提示輸入變數(顯式變數) { type: 'input',④ 提示輸入型別 name: 'foo',⑤ 模板變數名稱 message: 'Please input foo?',⑥ 提示資訊 'default': '{{ projectName }}'⑦ 模板變數預設值 }, { type: 'list', name: 'bar', message: 'Please select bar?', 'default': 'option1', choices: ['option1', 'option2', 'option3'], when: (answer) => {⑩ 當前變數是否需要提示 return true } } ], vars: {⑧ 隱式變數 baz: '{{ projectName }}' }, copyOnlyPaths: [ "**/test" ]⑨ 設定某些目錄和檔案不需要渲染,只是簡單的拷貝 };
說明:
- ① ~ ⑨ 與前面 JSON 風格配置檔案是一樣的,但是 JSON 風格配置檔案不支援配置函式型別的值,而 JS 風格配置檔案是支援。
- ⑩ 當前變數是否需要提示。可以根據使用者前面輸入的情況決定當前變數是否需要提示,具體可以參考:Inquirer 文件
兩種風格的配置檔案各有各的優缺點,JSON 風格比較簡潔,但是不支援函式;JS 風格略微複雜些,但是支援函式。如果模板專案需要很複雜的提示輸入,可以選擇 JS 風格。
支援模板語法的位置
- 模板專案配置檔案
- 模板根目錄
- 模板根目錄下的子目錄名稱(支援多層巢狀)
- 模板根目錄下的檔名稱(支援多層巢狀)
- 模板根目錄下的檔案內容(支援多層巢狀)
模板變數設定方式
有三種種方式設定模板變數:
-V,--var userPrompt vars
優先順序:引數設定 > 隱式變數。
優先順序:顯式變數 > 隱式變數。
說明:引數設定和顯示變數互斥出現,優先順序比較沒有意義。
模板語法
模板渲染底層是基於lodash ,詳情請參考:lodash 文件 。
主要用法:
-
模板表示式
模板表示式的正則表示式規則:
/{{([\s\S]+?)}}/g
,以{{
開頭,}}
結尾,中間可以是任意字元。
# 假設 foo = 'bar' hello {{ foo }}!輸出:hello bar! {{ foo === 'bar' }}輸出:true {{ _.isEmpty(foo) }}輸出:false {{ foo ? foo :'unknown' }}輸出:bar
說明:_
是 lodash 物件。
-
模板程式碼
模板程式碼的正則表示式規則:
/<%([\s\S]+?)%>/g
,以<%
開頭,%>
結尾,中間可以是任意字元。
<% if (foo === 'bar') { %> xxxxxxxxx <% } %> <% _.forEach(users, function(user) { %><li>{{ user }}</li><% }); %>
小結
自定義模板,支援通過配置檔案定義渲染規則,模板引擎根據渲染規則渲染模板專案。其中,模板引擎支援模板表示式和模板程式碼,我們可以通過命令列引數和提示輸入方式傳遞模板變數。