顯示具有 NuGet 標籤的文章。 顯示所有文章
顯示具有 NuGet 標籤的文章。 顯示所有文章

2026年6月12日 星期五

[研究]Mend(WhiteSource)誤判NuGet 安裝 vue 的 .nupkg 有問題,砍掉會怎樣?

[研究]Mend(WhiteSource)誤判NuGet 安裝 vue 的 .nupkg 有問題,砍掉會怎樣?

2026-06-12

*****

.nupkg 通常只是 NuGet 套件安裝檔(壓縮包),並不是網站執行時實際使用的檔案。

刪掉:

不會影響

  • ASP.NET 網站執行
  • Vue.js 載入
  • IIS 運作
  • 瀏覽器執行 Vue

因為實際使用的是:

/Scripts/vue.js

/Scripts/vue.min.js

不在 packages 目錄

**********

敝人實際測試砍掉 vue.2.6.11.nupkg,用 Visual Studio 開啟方案操作後,vue.2.6.11.pkg 又自動建立回去。

Git 上傳時,因 packages 目錄都沒上傳, vue.2.6.11.nupkg 自然沒上傳。

詢問AI,

一般情況下,Fortify SAST(Fortify Static Code Analyzer, SCA)不會像 Visual Studio 或 NuGet 那樣自動幫你下載缺少的 packages 目錄。

一般情況下,Mend 通常不會主動幫您執行 NuGet Restore,也不會自動編譯 ASP.NET WebForm 專案。

因為 Jenkins 有設定

nuget.exe restore .\WebApplication1\WebApplication1.sln

會在 Jenkins Server 主機重新下載 packages 目錄所有檔案。

(完)


2026年6月5日 星期五

[研究]ASP.NET WebForm 的 Libman 會像 NuGet 判斷是否有新版 ? 相依性 ?

[研究]ASP.NET WebForm 的 Libman 會像 NuGet 判斷是否有新版 ? 相依性 ?

2026-06-05

因為有的前端js元件,NuGet沒有提供最新版,甚至不再提供更新了;而Libman有提供,故研究一下。

ASP.NET WebForm 的 Libman 會像 NuGet 判斷是否有新版 ? 相依性 ?

*****

不會,LibMan(Library Manager) 和 NuGet 的設計目標不同。

LibMan 會判斷是否有新版嗎?

部分可以,但能力有限。

{
  "provider": "cdnjs",
  "library": "jquery@3.7.1",
  "destination": "wwwroot/lib/jquery/"
}

在 Visual Studio 中管理 libman.json 時,可以看到目前安裝版本與可選版本,例如:

Visual Studio 可能提示有較新版本(如 3.7.2),但:

  • 不會像 NuGet 那樣完整分析更新影響
  • 不會顯示相依套件更新建議
  • 不會進行安全性弱點檢查
  • 不會自動解決版本衝突

本質上只是從 CDN 提供者(如 cdnjs、unpkg、jsDelivr)查詢可用版本。

**********

LibMan 會處理相依性(Dependency)嗎?

基本上不會。

例如:

{
  "library": "bootstrap@5.3.8"   
}

Bootstrap 可能需要:


bootstrap.min.css bootstrap.bundle.min.js

LibMan 只會下載你指定的檔案:


"files": [ "dist/css/bootstrap.min.css", "dist/js/bootstrap.bundle.min.js" ]

但不會:

  • 自動安裝 Popper
  • 自動安裝 jQuery(舊版 Bootstrap)
  • 自動解析 NPM package dependency tree
  • 自動處理版本衝突

這些都是 NuGet 或 NPM 的工作。

**********

NuGet 與 LibMan 差異

功能 LibMan NuGet
下載前端 JS/CSS ✔ 可但不建議
下載 .NET DLL ✘ ✔
相依性解析 ✘ ✔
版本衝突檢查 ✘ ✔
安全性弱點分析 ✘ ✔
自動升級相依套件 ✘ ✔
Package Graph ✘ ✔
transitive dependency ✘ ✔

ASP.NET WebForm 專案中常見的第三方前端元件管理方式比較:

項目 LibMan NuGet NPM
主要用途 下載前端 JS/CSS 檔案 管理 .NET 套件 管理前端套件
適合 WebForm ★★★★★ ★★★★☆ ★★☆☆☆
需安裝 Node.js ✘ ✘ ✔
Visual Studio 原生支援 ✔ ✔ 部分
自動下載相依套件 ✘ ✔ ✔
相依性衝突檢查 ✘ ✔ ✔
版本管理能力 基本 完整 完整
可查看可升級版本 部分 ✔ ✔
套件鎖定版本 ✔ ✔ ✔
支援 Transitive Dependency ✘ ✔ ✔
支援 Semantic Version 有限 ✔ ✔
安全性弱點分析 ✘ ✔ ✔
Dependency-Track 掃描 較差 良好 良好
Mend/WhiteSource 掃描 較差 良好 良好
離線建置 ✔ ✔ 需先下載
學習門檻 低 低 高
維護成本 低 中 高

範例

需求 LibMan NuGet NPM
安裝 jQuery jquery@3.7.1 Install-Package jQuery npm install jquery
安裝 Bootstrap bootstrap@5.3.x Install-Package bootstrap npm install bootstrap
自動安裝相依套件 ✘ ✔ ✔
更新指令 手動修改版本 Update-Package npm update

實務建議

情境 建議
傳統 ASP.NET WebForm 維護案 LibMan 或 NuGet
公司要求 SCA(Mend、DT)完整掃描 NuGet 優先
新開發且有前端工程流程 NPM
只想放 jQuery、Bootstrap 幾個檔案 LibMan 最簡單
需要完整相依性管理與弱點追蹤 NuGet 或 NPM

若 WebForm 專案需要通過 OWASP Dependency-Track 或 Mend 稽核,我通常會建議:

類型 建議
.NET 元件 NuGet
JavaScript/CSS 元件 NPM(最佳)或 NuGet
LibMan 僅作為靜態檔案下載工具,不建議作為企業級元件管理機制

因為 LibMan 本質上只是把檔案下載到專案中,對於弱點追蹤、SBOM、相依性分析都遠不如 NuGet 或 NPM。

(完)

2026年4月14日 星期二

[研究]System.ValueTuple 4.5.0 升級到 4.6.x 後執行出錯

[研究]System.ValueTuple 4.5.0 升級到 4.6.x 後執行出錯

2025-04-14

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 20.2

********************************************************************************

ASP.NET WebForm Web Application 專案 System.ValueTuple 4.5.0 升級到 4.6.x 後,編譯成功,執行匯出會錯誤,出現

'/' 應用程式中發生伺服器錯誤。
無法載入檔案或組件 'System.ValueTuple, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 或其相依性的其中之一。 系統找不到指定的檔案。
描述: 在執行目前 Web 要求的過程中發生未處理的例外狀況。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。

例外狀況詳細資訊: System.IO.FileNotFoundException: 無法載入檔案或組件 'System.ValueTuple, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 或其相依性的其中之一。 系統找不到指定的檔案。

原始程式錯誤:


行 284:        catch (Exception)
行 285:        {
行 286:            throw;
行 287:        }
行 288:    }

原始程式檔: C:\Temp5\\Solution\WebApplication\Admin\Logs.aspx.cs    行: 286

堆疊追蹤:


[FileNotFoundException: 無法載入檔案或組件 'System.ValueTuple, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 或其相依性的其中之一。 系統找不到指定的檔案。]
   SixLabors.Fonts.StreamFontMetrics..ctor(TrueTypeFontTables tables) +0
   SixLabors.Fonts.StreamFontMetrics.LoadTrueTypeFont(FontReader reader) +892
   SixLabors.Fonts.FontCollection.AddImpl(Stream stream, CultureInfo culture, FontDescription& description) +92
   ClosedXML.Graphics.DefaultGraphicEngine.AddEmbeddedFont(FontCollection fontCollection) in /_/ClosedXML/Graphics/DefaultGraphicEngine.cs:258
   ClosedXML.Graphics.DefaultGraphicEngine..ctor(String fallbackFont) in /_/ClosedXML/Graphics/DefaultGraphicEngine.cs:69
   ClosedXML.Graphics.<>c.<.cctor>b__31_0() in /_/ClosedXML/Graphics/DefaultGraphicEngine.cs:55
   System.Lazy`1.CreateValue() +734
   System.Lazy`1.LazyInitValue() +189
   ClosedXML.Excel.XLWorkbook..ctor(LoadOptions loadOptions) in /_/ClosedXML/Excel/XLWorkbook.cs:784
   Admin_Logs.Button_Export_Xlsx_by_ClosedXML_Click(Object sender, EventArgs e) in C:\Temp5\\Solution\WebApplication\Admin\Logs.aspx.cs:286
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +138
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +150
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5445

版本資訊: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.8.4797.0

**********

ChatGPT   

Web.Config 出錯


<dependentAssembly> <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" /> </dependentAssembly>

改為


<dependentAssembly> <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.7.0" newVersion="4.0.7.0" /> </dependentAssembly>


執行 Update-Package System.ValueTuple -Reinstall


因為

Package Version Assembly Version
4.5.x 4.0.3.0
4.6.x 4.0.4.0~4.0.7.0

⚠️ ClosedXML 0.105 + SixLabors.Fonts 1.0.1

這組合有 2 個問題:

❌ 問題 1

SixLabors.Fonts 1.0.1 很舊

→ .NET Framework binding 相容性不好

❌ 問題 2

ClosedXML 0.105 在 Graphics engine 會強制載入 font engine

→ 直接觸發 ValueTuple load chain

**********

編譯成功,但有警告

已開始重建...

1>------ 已開始全部重建: 專案: WebApplication1, 組態: Debug Any CPU ------

1>  請考慮將組件 "System.ValueTuple, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" 的 app.config 從版本 "4.0.3.0" [C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\System.ValueTuple.dll] 重新對應至版本 "4.0.5.0" [C:\Git\Solution1\WebApplication1\packages\System.ValueTuple.4.6.2\lib\net47\System.ValueTuple.dll],以解決衝突並避免出現警告。

1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2203,5): warning MSB3247: 在同一個相依組件的不同版本之間發現衝突。請在 Visual Studio 中按兩下這個警告 (或選取後按 Enter) 解決這些衝突,或者將下列繫結重新導向加到應用程式組態檔中的 [執行階段] 節點: <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="System.ValueTuple" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" /><bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" /></dependentAssembly></assemblyBinding>

1>  WebApplication1 -> C:\Git\Solution1\WebApplication1\WebApplication1\bin\WebApplication1.dll

2>------ 已開始全部重建: 專案: WebApplication1.Tests, 組態: Debug Any CPU ------

2>  請考慮將組件 "System.ValueTuple, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" 的 app.config 從版本 "4.0.3.0" [C:\Git\Solution1\WebApplication1\WebApplication1\bin\System.ValueTuple.dll] 重新對應至版本 "4.0.5.0" [C:\Git\Solution1\WebApplication1\packages\System.ValueTuple.4.6.2\lib\net47\System.ValueTuple.dll],以解決衝突並避免出現警告。

2>C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2203,5): warning MSB3247: 在同一個相依組件的不同版本之間發現衝突。請在 Visual Studio 中按兩下這個警告 (或選取後按 Enter) 解決這些衝突,或者將下列繫結重新導向加到應用程式組態檔中的 [執行階段] 節點: <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="System.ValueTuple" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" /><bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" /></dependentAssembly></assemblyBinding>

2>  WebApplication1.Tests -> C:\Git\Solution1\WebApplication1\WebApplication1.Tests\bin\Debug\WebApplication1.Tests.dll

========== 全部重建: 2 成功、0 失敗、 0 略過 ==========


========== 全部重建: 2 成功、0 失敗、 0 略過 ==========

、、、、略,ChatGPT 又說要改回 4.0.5.0,然後又重複相同問題。

(待續)

相關

2025年11月14日 星期五

[研究]Visual Studio 的 NuGet相依套件變了

[研究]Visual Studio 的 NuGet相依套件變了

2025-11-14

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 20.2

NuGet 更新

System.Collections.Immutable 9.0.10 => 10.0.0
更新:
HtmlSanitizer 9.0.876 => 9.0.886
取消

因為之前更新 HtmlSanitizer 9.0.876 => 9.0.886 和 System.ValueTuple.4.5.0 -> 4.6.1 會出事,故取消

[研究]ASP.NET,無法載入檔案或組件 'System.ValueTuple
https://shaurong.blogspot.com/2025/05/aspnet-systemvaluetuple.html

System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
更新:
HtmlSanitizer 9.0.876 => 9.0.886
取消

System.IO.Packaging.9.0.10 -> 10.0.0
更新:
System.IO.Packaging.9.0.10 -> System.IO.Packaging.10.0.0
取消

System.IO.Packaging.9.0.10 -> 10.0.0
更新:
System.IO.Packaging.9.0.10 -> System.IO.Packaging.10.0.0
取消

System.Collections.Immutable 9.0.10 => 10.0.0
更新:
System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
System.ValueTuple.4.5.0 -> System.ValueTuple.4.6.1
居然變了,和上面不同???(上面是連續操作,不是隔陣子)

System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
更新:
System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
System.ValueTuple.4.5.0 -> System.ValueTuple.4.6.1
居然變了,和上面不同???

System.IO.Packaging  9.0.10 => 10.0.0
更新:
System.Formats.Asn1.9.0.10 -> System.Formats.Asn1.10.0.0
System.ValueTuple.4.5.0 -> System.ValueTuple.4.6.1
居然變了,和上面不同???

********************************************************************************

發現 Visual Studo 2019 的 NuGet 勾選安裝某一個套件,結果提示要安裝相依 B 套件,

取消,再次勾選和安裝和上次相同的一個套件,結果提示要安裝相依 C 套件,和上一次不同,Why ?

ChatGPT

這種現象在 Visual Studio 2019 NuGet 套件管理裡其實是可以理解的,原因通常和 NuGet 的相依解析機制有關,尤其是在多套件、版本範圍、以及本地快取的情況下。讓我仔細說明:


1️⃣ 套件相依版本範圍

NuGet 套件的依賴通常不是固定版本,而是 版本範圍,例如:

PackageA 1.0.0 依賴 PackageB >=1.0.0 <2.0.0

這表示 NuGet 可以選擇符合範圍的任何版本。

  • 第一次安裝,NuGet 可能選了 PackageB 1.5.0。
  • 取消後再次安裝,NuGet 可能重新解析依賴,選了 PackageC(如果 PackageB 在你的本地環境或快取中不可用,或解析策略不同)。

2️⃣ 本地快取與全局快取影響

NuGet 安裝時會使用 本地快取 (%UserProfile%\.nuget\packages):

  • 如果第一次解析失敗或部分安裝被取消,快取狀態可能變化。
  • 再次安裝時,NuGet 可能重新解析依賴,選擇不同版本的相依套件(甚至不同套件)來滿足版本要求。

3️⃣ 不同來源或封包版本

NuGet 會考慮你的 套件來源 (package source):

  • 官方 NuGet.org、公司內部 NuGet feed,甚至本地 .nupkg 檔案。
  • 若不同來源有不同版本的套件,解析時可能挑選不同版本,導致相依套件從 B 變 C。

4️⃣ NuGet 的相依解析演算法

Visual Studio 2019 的 NuGet 依賴解析邏輯是 試圖找到一個滿足所有版本限制的組合:

  • 如果取消安裝時某些中間套件被移除,再次解析時 NuGet 可能找到另一個不同組合來滿足依賴。
  • 特別是 PackageReference 的專案(vs packages.config)更容易出現不同解析結果。

5️⃣ 小結

所以你看到這種現象,主要原因是:

  • 套件相依通常是 範圍而非固定版本。
  • NuGet 每次解析時可能選擇不同滿足條件的組合。
  • 本地快取、取消安裝後的狀態、或不同來源版本,都可能影響解析結果。
  • 尤其在 Visual Studio 2019,NuGet 相依解析算法在這些邊緣情況下可能會有「不同結果」。

💡 建議方法:

  • 如果要固定依賴版本,手動在專案 .csproj 或 packages.config 指定版本號。
  • 或使用 nuget.config 指定來源和版本策略。

********************************************************************************

NuGet 如何解析套件相依性
https://learn.microsoft.com/zh-tw/nuget/concepts/dependency-resolution
How NuGet resolves package dependencies
https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution

Package versioning
https://learn.microsoft.com/zh-tw/nuget/concepts/package-versioning
https://learn.microsoft.com/en-us/nuget/concepts/package-versioning

How to trace resolving process of nuget package references
https://stackoverflow.com/questions/74004433/how-to-trace-resolving-process-of-nuget-package-references

(完)


2025年8月8日 星期五

[研究]ASP.NET WebForm 專案第三方元件後升級編譯出錯

[研究]ASP.NET WebForm 專案第三方元件後升級編譯出錯

2025-08-08

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

已開始重建...

1>------ 已開始全部重建: 專案: WebApplition1, 組態: Debug Any CPU ------

1>  請考慮將組件 "Autofac, Culture=neutral, PublicKeyToken=17863af14b0044da" 的 app.config 從版本 "8.3.0.0" [] 重新對應至版本 "8.4.0.0" [D:\Solution1\WebApplication1\packages\Autofac.8.4.0\lib\netstandard2.0\Autofac.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "ExtendedNumerics.BigDecimal, Culture=neutral, PublicKeyToken=65f1315a45ad8949" 的 app.config 從版本 "3000.0.4.132" [] 重新對應至版本 "3001.0.1.201" [D:\Solution1\WebApplication1\packages\ExtendedNumerics.BigDecimal.3001.0.1.201\lib\net48\ExtendedNumerics.BigDecimal.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "Microsoft.Bcl.AsyncInterfaces, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" 的 app.config 從版本 "9.0.0.6" [] 重新對應至版本 "9.0.0.8" [D:\Solution1\WebApplication1\packages\Microsoft.Bcl.AsyncInterfaces.9.0.8\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "Microsoft.Owin, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 的 app.config 從版本 "4.2.2.0" [] 重新對應至版本 "4.2.3.0" [D:\Solution1\WebApplication1\packages\Microsoft.Owin.4.2.3\lib\net45\Microsoft.Owin.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "Microsoft.Owin.Security, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 的 app.config 從版本 "4.2.2.0" [] 重新對應至版本 "4.2.3.0" [D:\Solution1\WebApplication1\packages\Microsoft.Owin.Security.4.2.3\lib\net45\Microsoft.Owin.Security.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "Microsoft.Owin.Security.Cookies, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 的 app.config 從版本 "4.2.2.0" [] 重新對應至版本 "4.2.3.0" [D:\Solution1\WebApplication1\packages\Microsoft.Owin.Security.Cookies.4.2.3\lib\net45\Microsoft.Owin.Security.Cookies.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "Microsoft.Owin.Security.OAuth, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 的 app.config 從版本 "4.2.2.0" [] 重新對應至版本 "4.2.3.0" [D:\Solution1\WebApplication1\packages\Microsoft.Owin.Security.OAuth.4.2.3\lib\net45\Microsoft.Owin.Security.OAuth.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "System.Collections.Immutable, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 的 app.config 從版本 "9.0.0.6" [] 重新對應至版本 "9.0.0.8" [D:\Solution1\WebApplication1\packages\System.Collections.Immutable.9.0.8\lib\net462\System.Collections.Immutable.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "System.Diagnostics.DiagnosticSource, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" 的 app.config 從版本 "9.0.0.6" [] 重新對應至版本 "9.0.0.8" [D:\Solution1\WebApplication1\packages\System.Diagnostics.DiagnosticSource.9.0.8\lib\net462\System.Diagnostics.DiagnosticSource.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "System.Formats.Asn1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" 的 app.config 從版本 "9.0.0.6" [] 重新對應至版本 "9.0.0.8" [D:\Solution1\WebApplication1\packages\System.Formats.Asn1.9.0.8\lib\net462\System.Formats.Asn1.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "System.Security.Permissions, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" 的 app.config 從版本 "9.0.0.6" [] 重新對應至版本 "9.0.0.8" [D:\Solution1\WebApplication1\packages\System.Security.Permissions.9.0.8\lib\net462\System.Security.Permissions.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "System.Text.Encoding.CodePages, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 的 app.config 從版本 "9.0.0.6" [] 重新對應至版本 "9.0.0.8" [D:\Solution1\WebApplication1\packages\System.Text.Encoding.CodePages.9.0.8\lib\net462\System.Text.Encoding.CodePages.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "System.Text.Encodings.Web, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" 的 app.config 從版本 "9.0.0.6" [] 重新對應至版本 "9.0.0.8" [D:\Solution1\WebApplication1\packages\System.Text.Encodings.Web.9.0.8\lib\net462\System.Text.Encodings.Web.dll],以解決衝突並避免出現警告。

1>  請考慮將組件 "System.Text.Json, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" 的 app.config 從版本 "9.0.0.6" [] 重新對應至版本 "9.0.0.8" [D:\Solution1\WebApplication1\packages\System.Text.Json.9.0.8\lib\net462\System.Text.Json.dll],以解決衝突並避免出現警告。

1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2203,5): warning MSB3247: 在同一個相依組件的不同版本之間發現衝突。請在 Visual Studio 中按兩下這個警告 (或選取後按 Enter) 解決這些衝突,或者將下列繫結重新導向加到應用程式組態檔中的 [執行階段] 節點: 


<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="Autofac" culture="neutral" publicKeyToken="17863af14b0044da" />
		<bindingRedirect oldVersion="0.0.0.0-8.4.0.0" newVersion="8.4.0.0" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="ExtendedNumerics.BigDecimal" culture="neutral" publicKeyToken="65f1315a45ad8949" />
		<bindingRedirect oldVersion="0.0.0.0-3001.0.1.201" newVersion="3001.0.1.201" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
		<bindingRedirect oldVersion="0.0.0.0-9.0.0.8" newVersion="9.0.0.8" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="Microsoft.Owin" culture="neutral" publicKeyToken="31bf3856ad364e35" />
		<bindingRedirect oldVersion="0.0.0.0-4.2.3.0" newVersion="4.2.3.0" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="Microsoft.Owin.Security" culture="neutral" publicKeyToken="31bf3856ad364e35" />
		<bindingRedirect oldVersion="0.0.0.0-4.2.3.0" newVersion="4.2.3.0" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="Microsoft.Owin.Security.Cookies" culture="neutral" publicKeyToken="31bf3856ad364e35" />
		<bindingRedirect oldVersion="0.0.0.0-4.2.3.0" newVersion="4.2.3.0" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="Microsoft.Owin.Security.OAuth" culture="neutral" publicKeyToken="31bf3856ad364e35" />
		<bindingRedirect oldVersion="0.0.0.0-4.2.3.0" newVersion="4.2.3.0" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="System.Collections.Immutable" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
		<bindingRedirect oldVersion="0.0.0.0-9.0.0.8" newVersion="9.0.0.8" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="System.Diagnostics.DiagnosticSource" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
		<bindingRedirect oldVersion="0.0.0.0-9.0.0.8" newVersion="9.0.0.8" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="System.Formats.Asn1" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
		<bindingRedirect oldVersion="0.0.0.0-9.0.0.8" newVersion="9.0.0.8" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="System.Security.Permissions" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
		<bindingRedirect oldVersion="0.0.0.0-9.0.0.8" newVersion="9.0.0.8" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="System.Text.Encoding.CodePages" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
		<bindingRedirect oldVersion="0.0.0.0-9.0.0.8" newVersion="9.0.0.8" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="System.Text.Encodings.Web" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
		<bindingRedirect oldVersion="0.0.0.0-9.0.0.8" newVersion="9.0.0.8" />
	</dependentAssembly>
</assemblyBinding>
<assemblyBinding
	xmlns="urn:schemas-microsoft-com:asm.v1">
	<dependentAssembly>
		<assemblyIdentity name="System.Text.Json" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
		<bindingRedirect oldVersion="0.0.0.0-9.0.0.8" newVersion="9.0.0.8" />
	</dependentAssembly>
</assemblyBinding>


********************************************************************************

解決

最後把這份砍了,把先前備份的 Source Code 複製一份過來,把 D:\Solution1\WebApplication1\packages 目錄整個砍了,再做一次 NuGet 升級,正常了。

(完)

相關

2025年7月21日 星期一

[研究]ASP.NET WebForm, CSP 會導致下面那些 NuGet 套件無法運作 ?

[研究]ASP.NET WebForm, CSP 會導致下面那些 NuGet 套件無法運作 ?

2025-07-21

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

ASP.NET WebForm, CSP 會導致下面那些 NuGet 套件無法運作 ?

  • AngleSharp 0.17.1
  • AngleSharp.Css 0.17.0
  • Antlr 3.5.0.2
  • Aspose.Cells 25.6.0
  • Autofac 8.3.0
  • Autofac.WebApi2 6.1.1
  • Bootstrap.Datepicker 1.8.0.1
  • BouncyCastle.Cryptography 2.6.1
  • ByteSize 2.1.2
  • Chart.js 3.7.1
  • ClosedXML 0.105.0
  • ClosedXML.Parser 2.0.0
  • Common.Logging 3.4.1
  • Common.Logging.Core 3.4.1
  • DocumentFormat.OpenXml 3.3.0
  • DocumentFormat.OpenXml.Framework 3.3.0
  • EFUtilities 1.0.2
  • EntityFramework 6.5.1
  • Enums.NET 5.0.0
  • ExcelDataReader 3.7.0
  • ExcelDataReader.DataSet 3.7.0
  • ExcelNumberFormat 1.1.0
  • ExtendedNumerics.BigDecimal 3000.0.4.132
  • FastMember 1.5.0
  • FastMember.Signed 1.5.0
  • Font.Awesome 5.15.4
  • FontAwesome 4.7.0
  • FreeDataExports 1.1.12
  • FreeSpire.PDF 8.6.0
  • HtmlSanitizer 9.0.876
  • HtmlSanitizer 9.0.886
  • Irony 1.5.3
  • Irony.NetCore 1.1.11
  • JetBrains.Annotations 2024.3.0
  • LinqKit 1.3.8
  • LinqKit.Core 1.2.8
  • LogicExtensions 0.0.3
  • MailKit 4.13.0
  • MathNet.Numerics.Signed 5.0.0
  • Microsoft.AspNet.FriendlyUrls 1.0.2
  • Microsoft.AspNet.FriendlyUrls.Core 1.0.2
  • Microsoft.AspNet.FriendlyUrls.Core.zh-Hant 1.0.2
  • Microsoft.AspNet.Identity.Core 2.2.4
  • Microsoft.AspNet.Identity.Core.zh-Hant 2.2.4
  • Microsoft.AspNet.Identity.EntityFramework 2.2.4
  • Microsoft.AspNet.Identity.EntityFramework.zh-Hant 2.2.4
  • Microsoft.AspNet.Identity.Owin 2.2.4
  • Microsoft.AspNet.Identity.Owin.zh-Hant 2.2.4
  • Microsoft.AspNet.Providers.Core 2.0.0
  • Microsoft.AspNet.Providers.Core.zh-Hant 2.0.0
  • Microsoft.AspNet.ScriptManager.MSAjax 5.0.0
  • Microsoft.AspNet.ScriptManager.WebForms 5.0.0
  • Microsoft.AspNet.Web.Optimization 1.1.3
  • Microsoft.AspNet.Web.Optimization.WebForms 1.1.3
  • Microsoft.AspNet.Web.Optimization.zh-Hans 1.1.3
  • Microsoft.AspNet.Web.Optimization.zh-Hant 1.1.3
  • Microsoft.AspNet.WebApi 5.3.0
  • Microsoft.AspNet.WebApi.Client 6.0.0
  • Microsoft.AspNet.WebApi.Client.zh-Hant 6.0.0
  • Microsoft.AspNet.WebApi.Core 5.3.0
  • Microsoft.AspNet.WebApi.Core.zh-Hant 5.3.0
  • Microsoft.AspNet.WebApi.WebHost 5.3.0
  • Microsoft.AspNet.WebApi.WebHost.zh-Hant 5.3.0
  • Microsoft.Bcl.AsyncInterfaces 9.0.6
  • Microsoft.Bcl.AsyncInterfaces 9.0.7
  • Microsoft.Bcl.Build 1.0.21
  • Microsoft.Bcl.Cryptography 9.0.6
  • Microsoft.Bcl.HashCode 6.0.0
  • Microsoft.CSharp 4.7.0
  • Microsoft.Extensions.DependencyInjection 9.0.6
  • Microsoft.Extensions.DependencyInjection.Abstractions 9.0.6
  • Microsoft.IO.RecyclableMemoryStream 3.0.1
  • Microsoft.NETCore.Platforms 7.0.4
  • Microsoft.Owin 4.2.2
  • Microsoft.Owin.Host.SystemWeb 4.2.2
  • Microsoft.Owin.Security 4.2.2
  • Microsoft.Owin.Security.Cookies 4.2.2
  • Microsoft.Owin.Security.OAuth 4.2.2
  • Microsoft.Web.Infrastructure 2.0.0
  • Microsoft.Win32.Primitives 4.3.0
  • MimeKit 4.13.0
  • Modernizr 2.8.3
  • Modernizr.New 3.4.0
  • Moment.js 2.30.1
  • NETStandard.Library 2.0.3
  • NLog 6.0.1
  • NLog.Schema 6.0.1
  • NPOI 2.7.4
  • NReco.PdfGenerator 1.2.1
  • Newtonsoft.Json 13.0.3
  • Newtonsoft.Json.Bson 1.0.3
  • Npoi.Mapper 6.2.2
  • Oracle.ManagedDataAccess 23.9.0
  • Owin 1.0
  • Portable.BouncyCastle 1.9.0
  • ProDotNetZip 1.20.0
  • RBush 4.0.0
  • RBush.Signed 4.0.0
  • Respond 1.4.2
  • RestSharp 106.15.0
  • RestSharp 112.1.0
  • Select2.js 4.0.13
  • SendGrid 9.29.3
  • SendGrid.CSharp.HTTP.Client 3.4.12
  • SendGrid.SmtpApi 1.4.6
  • SharpZipLib 1.4.2
  • SixLabors.Fonts 1.0.1
  • SixLabors.ImageSharp 3.1.10
  • Swashbuckle 5.6.0
  • Swashbuckle.Core 5.6.0
  • System.AppContext 4.3.0
  • System.Buffers 4.6.1
  • System.Collections 4.3.0
  • System.Collections.Concurrent 4.3.0
  • System.Collections.Immutable 9.0.6
  • System.Collections.Immutable 9.0.7
  • System.Configuration.ConfigurationManager 9.0.6
  • System.Console 4.3.1
  • System.Diagnostics.Debug 4.3.0
  • System.Diagnostics.DiagnosticSource 9.0.6
  • System.Diagnostics.Tools 4.3.0
  • System.Diagnostics.Tracing 4.3.0
  • System.Formats.Asn1 9.0.6
  • System.Formats.Asn1 9.0.7
  • System.Globalization 4.3.0
  • System.Globalization.Calendars 4.3.0
  • System.IO 4.3.0
  • System.IO.Compression 4.3.0
  • System.IO.Compression.ZipFile 4.3.0
  • System.IO.FileSystem 4.3.0
  • System.IO.FileSystem.Primitives 4.3.0
  • System.IO.Packaging 9.0.6
  • System.IO.Packaging 9.0.7
  • System.IO.Pipelines 9.0.6
  • System.IO.Pipelines 9.0.7
  • System.IO.UnmanagedMemoryStream 4.3.0
  • System.Linq 4.3.0
  • System.Linq.Dynamic.Core 1.6.6
  • System.Linq.Expressions 4.3.0
  • System.Linq.Queryable 4.3.0
  • System.Memory 4.6.3
  • System.Net.Http 4.3.4
  • System.Net.Primitives 4.3.1
  • System.Net.Sockets 4.3.0
  • System.Numerics.Vectors 4.6.1
  • System.ObjectModel 4.3.0
  • System.Reflection 4.3.0
  • System.Reflection.Emit.ILGeneration 4.7.0
  • System.Reflection.Emit.Lightweight 4.7.0
  • System.Reflection.Extensions 4.3.0
  • System.Reflection.Primitives 4.3.0
  • System.Resources.ResourceManager 4.3.0
  • System.Runtime 4.3.1
  • System.Runtime.CompilerServices.Unsafe 6.1.2
  • System.Runtime.CompilerServices.Unsafe 7.0.0-preview.2.22152.2
  • System.Runtime.Extensions 4.3.1
  • System.Runtime.Handles 4.3.0
  • System.Runtime.InteropServices 4.3.0
  • System.Runtime.InteropServices.RuntimeInformation 4.3.0
  • System.Runtime.Numerics 4.3.0
  • System.Security.AccessControl 6.0.1
  • System.Security.Cryptography.Algorithms 4.3.1
  • System.Security.Cryptography.Encoding 4.3.0
  • System.Security.Cryptography.Pkcs 9.0.6
  • System.Security.Cryptography.Primitives 4.3.0
  • System.Security.Cryptography.X509Certificates 4.3.2
  • System.Security.Cryptography.Xml 9.0.6
  • System.Security.Permissions 9.0.6
  • System.Security.Principal.Windows 5.0.0
  • System.Text.Encoding 4.3.0
  • System.Text.Encoding.CodePages 9.0.6
  • System.Text.Encoding.CodePages 9.0.7
  • System.Text.Encoding.Extensions 4.3.0
  • System.Text.Encodings.Web 9.0.6
  • System.Text.Encodings.Web 9.0.7
  • System.Text.Json 9.0.6
  • System.Text.Json 9.0.7
  • System.Text.RegularExpressions 4.3.1
  • System.Threading 4.3.0
  • System.Threading.Tasks 4.3.0
  • System.Threading.Tasks.Extensions 4.6.3
  • System.Threading.Tasks.Parallel 4.3.0
  • System.Threading.Timer 4.3.0
  • System.ValueTuple 4.5.0
  • System.ValueTuple 4.6.1
  • System.Xml.Linq 3.5.21022.801
  • System.Xml.ReaderWriter 4.3.1
  • System.Xml.XDocument 4.3.0
  • WebActivatorEx 2.2.0
  • WebGrease 1.6.0
  • WkHtmlToPdf 1.0.2
  • X.PagedList 10.5.7
  • XLParser 1.7.5
  • ZString 2.6.0
  • bootstrap 3.4.1
  • bootstrap 5.3.7
  • elmah 1.2.2
  • elmah.corelibrary 1.2.2
  • html5-shiv 3.7.3
  • icheck-bootstrap 3.0.1
  • jQuery 3.7.1
  • jQuery-datetimepicker 2.4.5
  • jQuery.UI.Combined 1.14.1
  • jQuery.Validation 1.21.0
  • js-cookie 2.2.1
  • popper.js 1.16.1
  • starkbank-ecdsa 1.3.3
  • vue 2.6.11

********************************************************************************

ChatGPT 說:

在 ASP.NET WebForm 專案中啟用 CSP(Content Security Policy) 後,會影響到 執行期會載入 JS/CSS 或執行動態 script/style 相關功能 的 NuGet 套件,特別是以下幾種類型會受限:

✅ 不會受 CSP 影響的 NuGet 套件類型(安全):

這些套件大多為:

  • 後端函式庫(處理資料、壓縮、加密、Excel、PDF)
  • 非動態載入資源、不執行 script 的前端套件
  • Entity Framework、ASP.NET Identity、NLog 等非 UI 相依元件

✅ 例子:

  • Aspose.Cells
  • ClosedXML
  • ExcelDataReader
  • EntityFramework
  • NPOI
  • Autofac
  • Newtonsoft.Json
  • MailKit / MimeKit
  • System.*、Microsoft.* 類別庫(非 WebResource)

⚠️ 可能會受 CSP 限制的 NuGet 套件類型(需注意)

這些元件若在前端透過 JS 動態載入、執行 inline script、style、eval、或使用 <script src="..."> 引用外部資源,在 CSP 預設 script-src 'self' 限制下會 被封鎖執行:

☑️ 建議設定:

  • CSP 中加入 unsafe-inline 或指定可信任的 CDN 來源(如 https://cdn.jsdelivr.net)

🔻 具體列出受影響的套件(⚠️ 若 CSP 嚴格,會壞掉或無法顯示)

套件問題原因
Bootstrap.Datepicker使用 inline script 及外部 CSS
Chart.js動態產生 <canvas> + JS 渲染
Font.Awesome, FontAwesome有時從 CDN 載入字型(需 font-src)
Modernizr, Modernizr.New使用 inline script
Moment.js若從外部載入或使用 eval
Select2.js有 inline JS 和外部資源
Respond動態 CSS 載入
jQuery, jQuery-UI, jQuery-datetimepicker, jQuery.Validation若用 inline JS 或外部載入
vue預設模板會包含 eval 或 inline JS
js-cookie, popper.js使用外部 CDN 時會被阻擋
bootstrap預設範例會用 inline script(如 tooltip)
html5-shiv, icheck-bootstrap需動態加載或 inline style

✅ 部分前端套件若本地化引用、無 inline JS 可正常運作

例如:

bootstrap 3.4.1 與 jQuery 若為本地 .js 檔案引用 + 無 eval、無 inline script,加上:

script-src 'self';

style-src 'self';

→ 可運作

但若套件包含像這樣的 <script>$('#abc').tooltip()</script> 則會因 CSP 阻擋而失效,需加上:

script-src 'self' 'unsafe-inline';

💡 建議做法:

  • 嚴格 CSP: 不建議使用含 inline script/style 的 UI 套件
  • 放寬 CSP: Global.asax.cs加上:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.Headers.Add("Content-Security-Policy",
        "default-src 'self'; " +
        "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net https://cdnjs.cloudflare.com https://unpkg.com; " +
        "style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net https://fonts.googleapis.com https://cdnjs.cloudflare.com; " +
        "font-src 'self' https://fonts.gstatic.com data:; " +
        "img-src 'self' data: https://cdn.jsdelivr.net; " +
        "connect-src 'self'; " +
        "frame-src 'self'; " +
        "object-src 'none'; " +
        "base-uri 'self'; " +
        "form-action 'self';"
    );
}

📦 常見 CDN 對應參考

  • Bootstrap / jQuery / FontAwesome / Chart.js https://cdn.jsdelivr.net, https://cdnjs.cloudflare.com
  • Select2 https://cdnjs.cloudflare.com
  • Vue https://unpkg.com
  • Google Fonts https://fonts.googleapis.com, https://fonts.gstatic.com

(完)

相關

2024年12月5日 星期四

[研究]NuGet 能同時安裝 bootstrap 3.4.1 和 5.3.3 嗎 ?

[研究]NuGet 能同時安裝 bootstrap 3.4.1 和 5.3.3 嗎 ?

2024-12-05

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

NuGet 能同時安裝  bootstrap 3.4.1 和 5.3.3 嗎 ?

ChatGPT 說:

在 NuGet 中,Bootstrap 是作為單一套件進行管理的,無法直接同時安裝多個版本(如 3.4.1 和 5.3.3)。因為 NuGet 的設計原則是每個套件的版本在同一個專案中只能存在一個實例。

然而,有幾種解決方法可以實現同一個專案使用多個版本的 Bootstrap:

解決方法 1:手動管理不同版本的文件

直接下載不同版本的 Bootstrap:

從 Bootstrap 官網 或 CDN 獲取兩個版本的 CSS 和 JS 文件。

將這些文件放置於專案中的不同資料夾中,例如:

/Content/bootstrap341/
/Content/bootstrap533/   

/Scripts/bootstrap341/
/Scripts/bootstrap533/

在需要的 .aspx 頁面,手動引用對應的文件:

<!-- For Bootstrap 3.4.1 -->
<link href="/Content/bootstrap341/bootstrap.min.css" rel="stylesheet" />
<script src="/Scripts/bootstrap341/bootstrap.min.js"></script>

<!-- For Bootstrap 5.3.3 -->
<link href="/Content/bootstrap533/bootstrap.min.css" rel="stylesheet" />
<script src="/Scripts/bootstrap533/bootstrap.bundle.min.js"></script>


解決方法 2:使用 libman 管理多版本

[LibMan (Library Manager)] 是 ASP.NET 支援的工具,可以讓你管理多個版本的前端資源。


右鍵點選專案,選擇 Add > Client-Side Library。

在彈出的視窗中分別添加不同版本的 Bootstrap:

Library: bootstrap@3.4.1 Target Location: /wwwroot/lib/bootstrap341

Library: bootstrap@5.3.3 Target Location: /wwwroot/lib/bootstrap533

在頁面中手動引用對應的資源:

<link href="/wwwroot/lib/bootstrap341/bootstrap.min.css" rel="stylesheet" />
<script src="/wwwroot/lib/bootstrap341/bootstrap.min.js"></script>

<link href="/wwwroot/lib/bootstrap533/bootstrap.min.css" rel="stylesheet" />
<script src="/wwwroot/lib/bootstrap533/bootstrap.bundle.min.js"></script>

解決方法 3:多專案分離處理

如果專案架構允許,可以將需要不同版本的頁面分開部署到不同的專案中,各自管理專案內的 NuGet 套件版本。

解決方法 4:自定義 NuGet 套件(進階用法)

創建自己的 NuGet 套件,分別包含 Bootstrap 3.4.1 和 5.3.3 的文件。

安裝自定義套件時,可將不同版本的資源安裝到專案中的不同目錄。


注意事項

樣式衝突:如果一個頁面同時加載兩個版本的 CSS 文件,樣式可能會互相覆蓋,導致顯示問題。為了避免衝突,可以使用 iframe 隔離不同版本的樣式,或者確保同一頁面僅使用單一版本的 Bootstrap。

維護成本:同時管理多個版本會增加開發和維護成本,建議盡量統一版本,僅在必要的情況下使用多版本方案。


(完)

相關

2024年10月17日 星期四

[研究]NuGet與Libman安裝bootstrap 5.3.3結果比較

[研究]NuGet與Libman安裝bootstrap 5.3.3結果比較

2024-10-17

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

NuGet安裝bootstrap 5.3.3結果

下圖,.css類的安裝在Content目錄;.js和.map安裝到 Scripts 目錄


********************************************************************************

Libmna安裝bootstrap 5.3.3結果





********************************************************************************

比較

libman安裝的bootstrap 5.3.3比NuGet安裝的,多了scss目錄。

註:NuGet 目前沒有 "bootstrap scss" 這種單獨安裝 scss 的選項。

********************************************************************************

NuGet 安裝 bootstrap 5.3.3 沒有提供 scss,但 libman 安裝 bootstrap 5.3.3 有提供,為什麼?

ChatGPT 說:

這是因為 NuGet 和 LibMan(Library Manager)處理前端資源的方式不同:

  • NuGet 主要用來管理後端的依賴項,特別是針對 .NET 相關的庫。當你通過 NuGet 安裝 Bootstrap 時,它會側重於提供最常見的用例,通常只包含經過編譯的 CSS 和 JavaScript 文件,而不包括 SCSS 源文件。這是因為很多開發者並不需要編譯 Bootstrap,而只需直接使用其已編譯的資源。
  • LibMan 是一個針對前端資源的輕量級管理工具。LibMan 允許你直接從外部的內容交付網絡(如 CDN)下載前端資源。在使用 LibMan 安裝 Bootstrap 時,它會下載完整的 Bootstrap 包,包括 SCSS 源文件。LibMan 可以更靈活地下載前端資源,不同於 NuGet 的篩選方式。

總結來說,這是由於兩者的設計理念和主要用途不同。LibMan 更適合於管理前端的資源,並且提供了更多樣的資源內容(例如 SCSS),而 NuGet 偏重於後端的管理,因此只包含部分前端資源。

(完)

相關

[研究]ASP.NET, NuGet, libman (Libaray Manager), npm (Node Package Manager) 比較

[研究]ASP.NET, NuGet, libman (Libaray Manager), npm (Node Package Manager) 比較

2024-10-17

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

ChatGPT 說:

以下是 ASP.NET + WebForm + Visual Studio 中使用 NuGet、LibMan 和 npm 的優缺點及套件升級和相依性管理的比較:

工具優點缺點套件升級相依性管理
NuGet- 原生支援 .NET 生態系統,適合 .NET 套件管理。- 主要針對 .NET 套件,對於前端資源管理不夠靈活。- 自動處理相依性和版本管理,升級時會自動檢查相依套件。
- 自動處理相依性和版本管理,簡化升級過程。- 對於前端庫的更新速度可能較慢,無法滿足最新需求。- 可以使用 Update-Package 指令輕鬆升級套件。
- 集成於 Visual Studio,易於使用。- 限於 NuGet 伺服器,某些最新的前端庫可能無法獲得。- 可使用 NuGet Package Manager 檢查過期套件。
LibMan- 專門為前端庫設計,支援多種資源(如 JavaScript、CSS)。- 功能相對簡單,無法取代完整的包管理工具(如 npm)。- 需要手動更新清單中的版本,升級過程不自動。
- 支援 CDN 和本地安裝,靈活性高。- 需要額外配置與 npm 和 NuGet 的整合。- 沒有內建的相依性管理功能,需依賴使用者管理。
- 整合於 Visual Studio,適合前端資源的管理。- 相對較新,社群支持和資源較少。- 更新時需手動檢查各個相依項的版本,無法自動處理。
npm- 廣泛的前端庫生態系統,能獲取最新的前端資源。- 對於 .NET 套件的支援有限,主要針對 JavaScript 庫。- 強大的相依性管理,可以控制版本範圍,升級時相依性自動處理。
- 功能強大的相依性管理,可以控制版本範圍。- 需要額外配置以適應 ASP.NET 環境,可能不太直觀。- 使用 npm update 可自動更新所有套件,並檢查相依性。
- 支援大量的社群資源和工具(如 webpack、babel 等)。- 可能會引入額外的複雜性,特別是對於不熟悉前端開發的人。- 提供 npm outdated 指令檢查過期套件和相依性問題。

總結
  • NuGet 是 .NET 環境中最常用的包管理工具,適合後端開發,能有效處理相依性和版本管理。
  • LibMan 提供前端資源的輕量級管理,但不支援自動相依性管理,適合小型或簡單的專案。
  • npm 是前端開發的主流工具,擁有豐富的資源和功能,並自動處理相依性,非常適合需要頻繁更新的前端專案。
根據專案需求,可以選擇最合適的工具來管理依賴項和升級。

註:Visual Studio內建僅有 NuGet 和 Libman,npm需要另外安裝 node.js 才能用。

(完)

相關

[研究]LibMan安裝bootstrap 5.3.3後,再用NuGet安裝bootstrap 5.3.3會如何?

[研究]LibMan安裝bootstrap 5.3.3後,再用NuGet安裝bootstrap 5.3.3會如何?
[研究]NuGet安裝bootstrap 5.3.3後,再用LibMan安裝bootstrap 5.3.3會如何?

2024-10-17

環境:Visual Studio 2019 + ASP.NET + WebForm + Web Application + .NET Framework

********************************************************************************

LibMan安裝bootstrap 5.3.3後



********************************************************************************

再用NuGet安裝bootstrap 5.3.3後

多了Content和Scripts 目錄



********************************************************************************

Visual Studio 2019 的LibMan安裝bootstrap 5.3.3後,再用NuGet安裝bootstrap 5.3.3會如何?

ChatGPT 說:

如果你在 Visual Studio 2019 中先使用 LibMan(Library Manager) 安裝 Bootstrap 5.3.3,然後再使用 NuGet 安裝相同版本的 Bootstrap,可能會導致以下情況:

  • 重複的 Bootstrap 文件:LibMan 和 NuGet 可能會將 Bootstrap 5.3.3 文件安裝到不同的位置。LibMan 一般會將庫安裝在 wwwroot/lib/ 文件夾中,而 NuGet 可能會將它們放置在 Content 或 Scripts 文件夾中。這樣可能會產生重複的 Bootstrap 文件,增加文件體積並且難以管理。
  • 版本衝突:如果 LibMan 和 NuGet 都安裝了相同版本的 Bootstrap,理論上版本不應該衝突。然而,如果你不小心指定了不同版本,則可能會引發兼容性問題或產生混亂,特別是當你從不同的文件夾引用不同版本的 Bootstrap。
  • 文件引用混亂:你的項目可能會在不同的位置引用 Bootstrap 文件。如果你沒有仔細控制這些引用(例如可能引用的是 LibMan 安裝的版本或 NuGet 安裝的版本),這可能會導致樣式或功能異常。

建議

  • 選擇一種方式 來管理你的前端資源:建議要麼使用 LibMan,要麼使用 NuGet,而不要同時使用它們來管理同一個庫,這樣可以避免文件重複和引用混亂。
  • 清理不需要的文件:如果你決定使用 NuGet 安裝 Bootstrap,那麼應該刪除通過 LibMan 安裝的文件,反之亦然。

如果你已經使用了其中一個包管理工具,最好不要再使用另一個來安裝相同的包,這樣可以保持項目的整潔和可維護性。

********************************************************************************

結論:是可以同時安裝的,使用可能要注意。

另外也有實際測試,NuGet安裝bootstrap 5.3.3後,再用LibMan安裝bootstrap 5.3.3,結果相同,安裝不會有錯誤。

(完)



2024年9月16日 星期一

[研究]Visual Studio 2019 內建那些套件管理工具(NuGet, Libman, npm)

[研究]Visual Studio 2019 內建那些套件管理工具(NuGet, Libman, npm)

2024-09-16

********************************************************************************

Visual Studio 2019 內建那些後端套件管理工具?

ChatGPT 說:

在 Visual Studio 2019 中,主要的後端套件管理工具包括:

1. NuGet

  • NuGet 是 Visual Studio 的內建工具,用於管理 .NET 和其他平台的套件。這是 Visual Studio 中最常用的後端套件管理工具。
  • 用途:
    • 安裝和更新 .NET 函式庫、工具和框架。
    • 管理專案的依賴項和版本。
  • 特點:
    • 支援從 NuGet 公共套件庫或私人套件庫安裝和管理套件。
    • 提供圖形化界面和命令列工具來進行套件管理。
  • 如何使用:
    • 右鍵點選專案,選擇「Manage NuGet Packages」。
    • 可以搜尋、安裝和更新所需的套件。



2. Package Manager Console

  • Package Manager Console 是 Visual Studio 中的一個命令列工具,用於管理 NuGet 套件。
  • 用途:執行 NuGet 命令,例如安裝、更新和卸載套件。
  • 特點:
    • 提供命令列界面來進行更靈活的套件管理操作。
    • 可用於執行與 NuGet 相關的各種操作,如套件安裝和遷移。
  • 如何使用:
    • 在 Visual Studio 中,選擇「Tools」->「NuGet Package Manager」->「Package Manager Console」。
    • 使用命令,例如 Install-Package <PackageName> 來安裝套件。




3. .NET CLI(Command-Line Interface)

  • .NET CLI 是一個命令行工具,允許開發者從命令行管理 .NET 專案和包。
  • 用途:用於執行各種 .NET 開發和管理任務,例如建立專案、安裝包、還原依賴項等。
  • 特點:提供了與 NuGet 相似的功能,但是通過命令行操作。
  • 如何使用:在命令提示字元或終端中使用 dotnet 命令,例如 dotnet add package <PackageName> 來安裝 NuGet 套件。



總結

在 Visual Studio 2019 中,內建的主要後端套件管理工具是 NuGet 和 Package Manager Console。這些工具用於安裝和管理 .NET 函式庫和工具。而 .NET CLI 是一個命令行工具,提供與 NuGet 相似的功能,可以從命令行執行套件管理操作。

********************************************************************************


Visual Studio 2019 內建那些前端套件管理工具?

ChatGPT

在 Visual Studio 2019 中,內建的前端套件管理工具主要包括以下兩個:

1. LibMan(Library Manager)

  • LibMan 是 Visual Studio 2019 中內建的前端資源管理工具。
  • 用途:管理和下載前端的 JavaScript 和 CSS 資源,如 jQuery、Bootstrap、Chart.js 等,直接從 CDN 來源(例如 CDNJS 和 unpkg)進行下載。
  • 特點:
    • 它可以讓你快速從 CDN 獲取前端資源並放置在指定的專案資料夾中(如 Scripts、Content 等)。
    • 只用於下載單一的資源文件,不管理資源的依賴關係。
    • 適合需要輕量化前端庫管理的情境。
  • 使用場景:適合需要集成少量前端資源的專案。
  • 如何使用:
    • 在專案的某個資料夾上(如 Scripts 或 Content),右鍵選擇「Add Client-Side Library」。
    • 選擇 CDN 來源,然後搜索所需的前端資源。
    • 選擇版本並安裝,LibMan 會將資源放置在指定的資料夾中。



2. NuGet(主要是後端,但可以安裝某些前端資源)

  • NuGet 是 Visual Studio 的內建套件管理工具,專為 .NET 和後端資源設計。
  • 用途:管理和下載 .NET 函式庫和工具,但也能找到部分前端資源(如 jQuery、Modernizr)。
  • 特點:
    • 雖然主要用於後端依賴,但某些前端庫也可以通過 NuGet 下載。
    • 不適合管理前端的依賴關係,且不像 LibMan 針對 CDN 進行優化。
    • 使用場景:用於當前端資源以 NuGet 套件形式存在時(例如 jQuery)。
  • 如何使用:
    • 右鍵專案,選擇「Manage NuGet Packages」。
    • 搜索前端資源(如 jQuery),並安裝所需版本。

**********

非內建但可手動添加的前端套件管理工具:

npm(Node Package Manager):不是內建工具,但可以手動添加並安裝 Node.js 來進行更靈活的前端套件管理,適合更現代的前端開發工作流(如 React、Angular 等)。

結論:

Visual Studio 2019 內建的前端套件管理工具包括 LibMan(Library Manager) 和 NuGet。如果你的需求主要是管理前端資源,推薦使用 LibMan。

********************************************************************************

(完)

相關

[研究]用Visual Studio 2022 Installer 和 nvm-windows 1.1.12 安裝 node.js v20.10.0 LTS、npm、nvm
https://shaurong.blogspot.com/2024/01/visual-studio-2022-installer-nvm.html

[研究]node.js和npm安裝方法比較 (官方、VS、nvm-windows)
https://shaurong.blogspot.com/2024/01/nodejsnpm-vsnvm-windows.html

[研究]用nvm-windows 1.1.12 安裝 node.js 和 npm、react
https://shaurong.blogspot.com/2024/01/nvm-windows-1112-nodejs-npm.html

[研究]node v21.5.0 與 npm 10.2.4官方下載安裝(Windows Server 2022)
https://shaurong.blogspot.com/2024/01/node-v2150-npm-1024windows-server-2022.html


2024年4月7日 星期日

[研究]NuGet 為何不提供 ckeditor v5?

[研究]NuGet 為何不提供 ckeditor v5?

2024-04-07

NuGet 為何不提供 ckeditor v5 ?

ChatGPT

NuGet 是用於在 .NET 平台上管理和共享程式庫的套件管理器,而 CKEditor 是一個流行的用於實現所見即所得(WYSIWYG)編輯器的 JavaScript 程式庫。目前,CKEditor v5 的原始碼通常是透過 npm(Node Package Manager)來安裝和管理的,而不是 NuGet。因此,NuGet 不會提供 CKEditor v5 的套件。

通常來說,NuGet 主要專注於提供 .NET 平台上的程式庫和工具,而不是用於 JavaScript 的工具。所以,如果您想在 .NET 專案中使用 CKEditor v5,您需要透過其他方式(例如,直接從 npm 安裝,然後透過打包工具將其整合到您的 .NET 專案中)來管理和使用它。

********************************************************************************

NuGet 為何不提供 ckeditor v5 ?

Copilot

NuGet 是一個方便的套件管理工具,但是它的套件庫並不包含 CKEditor 5 的最新版本。目前,CKEditor 5 只能在 GPL copyleft 授權(或商業授權)下使用。如果你的專案是開源的且使用了不相容 GPL 授權的其他開源項目,你可以申請使用 Free for Open Source 計劃,以便使用 CKEditor 5。然而,如果你仍然想使用 CKEditor 5,你可以直接從它的下載頁面使用它的 CDN。以下是一個在 ASP.NET 專案中使用 CKEditor 5 的範例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>CKEditor 5 – Classic editor</title>
    <script src="https://cdn.ckeditor.com/ckeditor5/12.0.0/classic/ckeditor.js"></script>
</head>
<body>
    <h1>Classic editor</h1>
    <asp:TextBox ID="txtarea" runat="server" ClientIDMode="Static"></asp:TextBox>
    <script>
        ClassicEditor
            .create(document.querySelector('#txtarea'))
            .catch(error => {
                console.error(error);
            });
    </script>
</body>
</html>



********************************************************************************

(完)

2024年3月25日 星期一

[研究]刪除NuGet快取

[研究]刪除NuGet快取

2024-03-25

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************


Microsoft Windows [版本 10.0.17763.5576]
(c) 2018 Microsoft Corporation. 著作權所有,並保留一切權利。

D:\>dotnet nuget locals --clear all
正在清除 NuGet HTTP 快取: C:\Users\Administrator\AppData\Local\NuGet\v3-cache
正在清除 NuGet 全域套件資料夾: C:\Users\Administrator\.nuget\packages\
正在清除 NuGet 暫存快取: C:\Users\Administrator\AppData\Local\Temp\1\NuGetScratch
正在清除 NuGet 外掛程式快取: C:\Users\Administrator\AppData\Local\NuGet\plugins-cache
已清除本機資源。

D:\>

(完)

相關

2022年11月18日 星期五

[研究][ASP.NET]無法解析相依性 'SixLabors.Fonts'。

[研究][ASP.NET]無法解析相依性 'SixLabors.Fonts'。已使用來源: 'nuget.org', 'Microsoft Visual Studio Offline Packages'。

2022-11-18

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#

嚴重性 程式碼 說明 專案 檔案 行 隱藏項目狀態

錯誤 無法解析相依性 'SixLabors.Fonts'。已使用來源: 'nuget.org', 'Microsoft Visual Studio Offline Packages'。

********************************************************************************

解決

研究發現 ClosedXML 0.96 => 0.97 和  NPOI 2.5.6 => 2.6.0 時候需要 SixLabors.Fonts 套件,但 Visual Studio 2022 NuGet 找不到該套件進行安裝。

而 NuGet「已安裝」會出現 deprecated (棄用)訊息,就是  ClosedXML 0.96 和 NPOI 2.5.6 這兩個。

目前 NuGet 網址搜尋 SixLabors.Fonts 可找到
https://www.nuget.org/packages?q=SixLabors.Fonts



(下圖) 把「包括搶鮮版」打勾,可以搜尋到 SixLabors.Fonts

安裝後,NuGet 「更新」畫面會多出一些非正式版 (穩定版) 的套件,所以建議再次把「包括搶鮮版」的打勾取消。

另一個選擇,是等 SixLabors.Fonts 出正式版,不升級 ClosedXML 0.96 和 NPOI 2.5.6。 

(完)