這篇文章我們繼續以 Hello World Bot 這個 sample 來講一下 manifest template。
實際上在 Teams app 開發的時候,有 manifest 的概念,manifest 是用來說明這個 teams app 的一些基本信息和配置信息,比如 app 的名字,app有哪些能力,app 的bot id是多少。具體的 manifest 的 schema 可以參考這個官方文檔?Manifest schema reference - Teams | Microsoft Learn?,我會在以后的文章里詳細介紹 manifest 的每一塊每一個細節。
但是傳統的 Teams app 開發里沒有 manifest template 的概念,這個template 是 Teams Toolkit 里的概念。為什么需要一個 template 呢?因為我們一般的開發流程和開發周期需要幾個環境,比如開發環境,測試環境,UAT環境,生產環境。在不同的環境里,我們會有不同的 app 設置,比如 bot id 是不同的,可能這些環境共用一個M365 tenant,但為了區分會使用不同的 app 名字,比如開發環境的叫?MyBot-dev
,在uat環境的可能叫?MyBot-uat
,所以需要有不同的 manifest 文件,但是這些 manifest 文件里又有很多部分會很相似。
所以 Teams Toolkit 為了解決這個問題,加入了 manifest template 的概念,我們來看一下 template 文件?manifest.template.json
?里面是怎么寫的。
{"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.14/MicrosoftTeams.schema.json","manifestVersion": "1.14","version": "1.0.0","id": "","packageName": "com.microsoft.teams.extension","developer": {"name": "Teams App, Inc.","websiteUrl": "https://www.example.com","privacyUrl": "https://www.example.com/privacy","termsOfUseUrl": "https://www.example.com/termsofuse"},"icons": {"color": "resources/color.png","outline": "resources/outline.png"},"name": {"short": "","full": ""},"description": {"short": "Short description of ","full": "Full description of "},...
}
我們可以看到文件里面使用了?來表明一個 placeholder,這些 placeholder 又分為兩大類,分別是
?和 ``,他們實際上是對應了?.fx
?目錄里的兩類文件。
對于 local 環境,有對應的 config.local.json 和 state.local.json 文件,state 文件是在運行后自己生成的。我們來看一下 config.local.json 文件的內容。
{"$schema": "https://aka.ms/teamsfx-env-config-schema","description": "You can customize the TeamsFx config .....","manifest": {"appName": {"short": "HelloWorldBot-local-debug","full": "Full name for HelloWorldBot-local-debug"}}
}
回到前面的一個 placeholder ``,對照上面的 config 文件內容,我們可以知道,這個placeholder,將被值?HelloWorldBot-local-debug
?所替換。我們找到替換后的生成的最終 manifest 文件:?/build/appPackage/manifest.local.json
...
"name": {"short": "HelloWorldBot-local-debug","full": "Full name for HelloWorldBot-local-debug"
},
"description": {"short": "Short description of HelloWorldBot-local-debug","full": "Full description of HelloWorldBot-local-debug"
},
...
state 的 placeholder 也類似,我們可以在?state.xxx.json
?里找到對應的值。不同的是,state 文件是 teams toolkit自動生成的,所以如果我們自己需要增加一些不同環境不同的配置,我們要使用 config,而不是 state。
好,我們來改一個試試看,打開?manifest.template.json
?文件,把 websiteUrl 改成如下的placeholder ``
"developer": {"name": "Teams App, Inc.","websiteUrl": "","privacyUrl": "https://www.example.com/privacy","termsOfUseUrl": "https://www.example.com/termsofuse"},
然后我們在 config.local.json 文件中加入 website。
{..."manifest": {"appName": {...},"website": "https://mysite-local.com"}
}
然后我們在dev環境的 config.dev.json 文件中加入對應的 website。
{..."manifest": {"appName": {...},"website": "https://mysite-dev.com"}
}
運行一下我們的app,這樣 Teams Toolkit 會重新生成一個 manifest json 文件。打開新生成的?/build/appPackage/manifest.local.json
,可以看到 website 就是我們在?config.local.json
?里配置的。
...
"developer": {"websiteUrl": "https://mysite-local.com",....
},
...
前面我們講了好幾個文件,可能有點暈,我們用一張圖來總結。