自從安裝Visual Studio NuGet Packager套件後,製作及上傳NuGet Package的工作輕鬆許多。隨著應用範圍擴大,發現一個問題:當打包項目變多,有時會發生編譯後一直停在編譯狀態永遠不結束,只能強制中止。試著增減打包項目,反覆測試後確定一點,當住與項目數目無絕對關聯,而是「項目愈多,出問題機率愈高」。

為追查問題看了NuGetPackage.ps1,才對NuGet Packager運作原理有點了解。原來它在背後是透過PowerShell Script使用程序物件啟動nuget.exe,呼叫WaitForExit()等待程序結束,透過StandardOutput、StandardError擷取輸出,再依ExitCode判斷作業成功或失敗。

測試直接執行「nuget pack Package.nuspec –Verbosity Detailed」,無論項目多寡都能順利完成。我這才注意到,原先編譯無反應時下,其實打包檔已順利產生。換句話說,若要精準描述問題,應為「當打包項目較多,有時會出現NuGet跑完但WaitForExit()沒被觸發,造成使用者空等」,試著寫成WaitForExit(10*1000)加上10秒逾時設定,編譯狀態便會在10秒後結束且結果正確,驗證問題出在WaitForExit()未正確偵測到程序結束。

依此推論是PowerShell WaitForExit的Bug,朝此方向爬文,在官網QA找到相同問題回報,而有網友提供一則決方案,將$packageTask.WaitForExit()如下圖移至$output及$error字串讀取動作的後方,果真解決了問題。

以上經驗提供使用NuGet Packager的朋友參考。而本次調查另一項收獲是見識到NuGet Packager利用PowerShell存取專案項目進行作業,這個技巧對開發自動化很有用處,收入錦囊~


Comments

Be the first to post a comment

Post a comment