大家都知道,在 dotnet 發布時,將會在輸出的 publish 檔案夾包含所需的依賴,在 .NET Core 開始,引入了 AppHost 的概念,即使是單個程式集,也需要獨立的 Exe 可執行檔案帶上實際包含 Main 函式的 dll 檔案,特別是進行獨立發布的時候,輸出檔案夾上有超級多個檔案,看起來不清真,本文來告訴大家如何使用 PublishFolderCleaner 工具讓發布檔案夾只留一個 Exe 和一個 Lib 檔案夾
使用方法
使用方法十分簡單,只需要安裝 dotnetCampus.PublishFolderCleaner 庫即可,編輯入口專案的 csproj 檔案,添加如下代碼
<ItemGroup>
<PackageReference Include="dotnetCampus.PublishFolderCleaner" Version="3.0.3" />
</ItemGroup>
接下來就和之前一樣發布即可,不影響原有的發布步驟
效果
發布完成之后,打開發布檔案夾,此時可以發現原本亂糟糟的檔案夾被替換為只有一個 exe 可執行檔案和一個 lib 檔案夾,雙擊 exe 可執行檔案即可獲得和之前一樣的效果
打開 Lib 檔案夾,可以看到此檔案夾里面就是原本放在發布檔案夾里面的除了入口 exe 之外的其他檔案
以上的 PublishFolderCleaner 工具的作用就是將發布檔案夾里面的所有檔案,除了入口 exe 之外的檔案,都放入到 lib 檔案夾里面,然后修改入口 exe 檔案的邏輯,讓入口 exe 可以從 lib 檔案夾里面讀取入口 dll 檔案,從而實作此功能
例子
我創建了一個基于 .NET 5 的 WPF 應用,給此應用加上 dotnetCampus.PublishFolderCleaner 的 NuGet 包
接著使用命令列進行發布,發布命令如下
dotnet publish -r win-x64 -c release --self-contained
接著進入到 bin\Release\net5.0-windows\win-x64\publish\ 檔案夾,可以看到此檔案夾只有存放一個 exe 和一個 lib 檔案夾,如下
| WhihuqeabaLeelurlallball.exe
|
\---lib
| clrcompression.dll
| clretwrc.dll
| clrjit.dll
| coreclr.dll
| createdump.exe
| WhihuqeabaLeelurlallball.deps.json
| WhihuqeabaLeelurlallball.dll
| WhihuqeabaLeelurlallball.pdb
| WhihuqeabaLeelurlallball.runtimeconfig.json
| WindowsBase.dll
| WindowsFormsIntegration.dll
| wpfgfx_cor3.dll
| // 忽略很多檔案
+---zh-Hans
| Microsoft.VisualBasic.Forms.resources.dll
| PresentationCore.resources.dll
| // 忽略很多檔案
|
\---zh-Hant
Microsoft.VisualBasic.Forms.resources.dll
// 忽略很多檔案
代碼
本文所有代碼放在 github 和 gitee 歡迎訪問
可以通過如下方式獲取本文的源代碼,先創建一個空檔案夾,接著使用命令列 cd 命令進入此空檔案夾,在命令列里面輸入以下代碼,即可獲取到本文的代碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 24c0c22f4a0bb292893ac09aba2f14b3b84a2d6e
以上使用的是 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
獲取代碼之后,進入 WhihuqeabaLeelurlallball 檔案夾
可以通過這個簡單的例子試試效果
原理
本文使用的 PublishFolderCleaner 工具,在 GitHub 上完全開源,屬于我所在團隊構建工具鏈的工具,請看 https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK
核心機制就是添加構建調度步驟,在發布之后執行移動檔案和修改入口 exe 兩個步驟
其中添加構建調度的邏輯代碼如下
<Project>
<Target Name="MoveThePublishFolderToLibFolder" AfterTargets="Publish">
<PropertyGroup>
<PublishFolderCleanerCommandArgs>dotnet "$(MSBuildThisFileDirectory)..\tools\net5.0\PublishFolderCleaner.dll" -p "$(PublishDir) " -a "$(AssemblyName)"</PublishFolderCleanerCommandArgs>
</PropertyGroup>
<Exec Command="$(PublishFolderCleanerCommandArgs)"></Exec>
</Target>
</Project>
也就是在發布完成之后,通過 dotnet 命令呼叫 PublishFolderCleaner 工具,如上面代碼可以看到這是一個 .NET 5 的工具,要求當前開發者的開發環境里面安裝有 .NET 5 才能執行此工具
在 PublishFolderCleaner 工具里面完成如上兩個步驟,將原有的放在發布檔案夾里面的檔案全部放入到里層的 lib 檔案夾,再通過修改入口 exe 可執行檔案,也就是 AppHost 檔案,讓入口 exe 從原本的相同檔案夾讀取入口 dll 替換為從 lib 檔案夾里面讀取入口 dll 檔案
關于修改 AppHost 檔案的知識,請參閱 dotnet core 應用是如何跑起來的 通過AppHost理解運行程序 和 dotnet 桌面端基于 AppHost 的配置式自動切換更新后的應用程式路徑
博客園博客只做備份,博客發布就不再更新,如果想看最新博客,請到 https://blog.lindexi.com/

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可,歡迎轉載、使用、重新發布,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改后的作品務必以相同的許可發布,如有任何疑問,請與我[聯系](mailto:[email protected]),
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/325207.html
標籤:.NET Core
上一篇:C# 提取PDF中的表格
