2014年12月3日 星期三

使用 MSBuild 編譯 Universal Apps 發生 error MSB3325, MSB3321

如果要在編譯工作中加入一些特別的行為,通常會透過 Visual Studio 加入專案建置前或建置後的工作,或是寫成 proj 檔案讓 MSBuild.exe 執行編譯工作再加上一些 Script,在使用 MSBuild 進行 Universal Apps 的 Release 編譯時,因為必須選擇 pfx 憑證,可能在編譯時期會出現以下錯誤訊息

"d:\GitHub\hubapp_windows_store\msbuild.proj" (預設目標)
(1) ->"d:\GitHub\hubapp_windows_store\HubApp\HubApp.Windows\HubApp.Windows.csproj" (ReBuild 目標)
(2) ->(ResolveKeySource 目標) ->  C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(2482,5):
error MSB3325: 無法匯入下列金鑰檔: code_signing.pfx。此金鑰檔可能有密碼保護。若要改正這種情況,請嘗試再次匯入憑證,或以手動方式將憑證安裝到具有下列金鑰容器名稱的強式名稱 CSP: VS_KEY_F11A3882EC084A59
[d:\KKGitHub\hubapp_windows_store\HubApp\HubApp.Windows\HubApp.Windows.csproj]  C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(2482,5): error MSB3321: 已取消匯入金鑰檔 "code_signing.pfx"。 [d:\GitHub\hubapp_windows_store\HubApp\HubApp.Windows\HubApp.Windows.csproj]

    0 個警告
    2 個錯誤

其實這個錯誤訊息的指示非常清楚,要做的事情就是所謂的 "以手動方式將憑證安裝到具有下列金鑰容器名稱的強式名稱 CSP: VS_KEY_XXXXXXXXXXXXXXXX" 這件事,但是這件事到底怎麼做還真的從字面上看不出來,這也是特別寫筆記錄的原因。

首先必須找到 Sn.exe 這個工具,這個 Sn.exe 是 Visual Studio 內建的 tool,以 VS 2013 為例,位置在 C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools

利用管理員身份打開 Cmd 後切換到這個目錄底下,輸入 sn -i 憑證位置 強式名稱

舉我的例子就是這個樣子

C:\WINDOWS\system32>cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools>sn -i
D:\GitHub\hubapp_windows_store\HubApp\HubApp.Windows\code_signing.pfx VS_KE
Y_F11A3882EC084A59


此時 sn 工具會詢問你這個 pfx 的密碼,輸入後即完成錯誤提示的動作

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.33440
Copyright (c) Microsoft Corporation.  All rights reserved.

Enter the password for the PKCS#12 key file: // 輸入你的密碼
Key pair installed into 'VS_KEY_F11A3882EC084A59'

在完成上述動作後,將這個 pfx 安裝 (直接雙擊) 到啟動 Jenkins 的使用者身份上即可解決這兩個 error。

Sn.exe (強式名稱工具) 官方文件:http://msdn.microsoft.com/zh-tw/library/k5b5tt23(v=vs.110).aspx

順代一提,編譯 Universal Apps 時必須使用 VS 2013 中的 MSBuild,位置在 C:\Program Files (x86)\MSBuild\12.0\Bin 和以前常用的 MSBuild 3.5、4.0 擺放的位置不太一樣。




沒有留言:

張貼留言