近期需要在無網路的環境下透過 Jenkins 來編譯 Dotnet Core,在編譯的過程中發生了以下錯誤訊息,但是我卻又無法透過錯誤訊息得知到底是缺少了哪個 nuget package
會有這樣的問題,主因當然是缺少了必要的 nuget package,在執行 dotnet build 的時候,如果有缺少 package,就會連線到 api.nuget.org 來抓取,而我的環境又無法連外,所以當然會出現錯誤訊息。
warning NU1900: 取得套件弱點資料時發生錯誤: 無法載入來源 https://api.nuget.org/v3/index.json 的服務索引。
為了要得知到底是缺少了哪個 package,首先要先確認 Jenkins 執行時是使用哪個帳號執行,因為這會和你在命令列處理時使用的帳號不一樣,帳號不一樣,設定檔的位置也會有所不同。
先在 pipeline 來判斷是使用哪個帳號執行
stage('Debug NuGet Config') {
steps {
bat '''
whoami
echo %APPDATA%
dir %APPDATA%\\NuGet
dotnet nuget locals all --list
'''
}
}
像我自己 Jenkins 執行時使用的帳號是 nt authority\system ,而對應的 nuget.config 如下
C:\Windows\System32\config\systemprofile\AppData\Roaming\NuGet
接下來修改以下內容,加入 clear 的目的在於,我不想要讓他最後又連接到 api.nuget.org
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear/>
<add key="offline" value="C:\nuget\packages" />
</packageSources>
</configuration>
如果沒有加上 clear ,實際上在執行的時候,還會再去 %ProgramFiles(x86)%\NuGet\Config\ 檢查檔案是否存在,所以訊息上面會額外顯示 Microsoft Visual Studio Offline Packages ,而我自己的習慣是加上 clear 。
之後再執行 dotnet build 就會逐一列出缺少哪些項目,再把這些項目補齊就可以正常編譯了。
※延伸閱讀
0 意見:
張貼留言