<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          開發(fā)技巧:讓.NET應(yīng)用發(fā)布文件夾更清爽!

          共 4503字,需瀏覽 10分鐘

           ·

          2024-04-11 05:13

          鏈接:cnblogs.com/lindexi/archive/2021/10/19/15423277.html


          前言


          大家都知 道,在.NET  發(fā)布時,將會在輸出的 publish 文件夾包含所需的依賴。 在  .NET Core 開始, 引入了 AppHost 的概念,即使是單個程序集,也需要獨立的 Exe 可執(zhí)行文件帶上實際包含 Main 函數(shù)的 dll 文件。


          特別是進(jìn)行獨立發(fā)布的時候,輸出文件夾上有超級多個文件,看起來不清真。 本文來告訴大家如何使用 PublishFolderCleaner 工具讓發(fā)布文件夾只留一個 Exe 和一個 Lib 文件夾


          使用方法


          使用方法十分簡單,只需要安裝 dotnetCampus.PublishFolderCleaner 庫即可。編輯入口項目的 csproj 文件,添加如下代碼

                
                <ItemGroup>
            <PackageReference Include="dotnetCampus.PublishFolderCleaner" Version="3.0.3" />
          </ItemGroup>

          接下來就和之前一樣發(fā)布即可,不影響原有的發(fā)布步驟

          效果

          發(fā)布完成之后,打開發(fā)布文件夾,此時可以發(fā)現(xiàn)原本亂糟糟的文件夾被替換為只有一個 exe 可執(zhí)行文件和一個 lib 文件夾。雙擊 exe 可執(zhí)行文件即可獲得和之前一樣的效果

          打開 Lib 文件夾,可以看到此文件夾里面就是原本放在發(fā)布文件夾里面的除了入口 exe 之外的其他文件

          以上的 PublishFolderCleaner 工具的作用就是將發(fā)布文件夾里面的所有文件,除了入口 exe 之外的文件,都放入到 lib 文件夾里面,然后修改入口 exe 文件的邏輯,讓入口 exe 可以從 lib 文件夾里面讀取入口 dll 文件,從而實現(xiàn)此功能

          例子

          我創(chuàng)建了一個基于 .NET 5 的 WPF 應(yīng)用,給此應(yīng)用加上 dotnetCampus.PublishFolderCleaner 的 NuGet 包

          接著使用命令行進(jìn)行發(fā)布,發(fā)布命令如下

                
                dotnet publish -r win-x64 -c release --self-contained

          接著進(jìn)入到 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 歡迎訪問

          可以通過如下方式獲取本文的源代碼,先創(chuàng)建一個空文件夾,接著使用命令行 cd 命令進(jìn)入此空文件夾,在命令行里面輸入以下代碼,即可獲取到本文的代碼

                
                git init
          git remote add origin https://gitee.com/lindexi/lindexi_gd.git
          git pull origin 24c0c22f4a0bb292893ac09aba2f14b3b84a2d6e

          以上使用的是 gitee 的源,如果 gitee 不能訪問,請?zhí)鎿Q為 github 的源

                
                git remote remove origin
          git remote add origin https://github.com/lindexi/lindexi_gd.git

          獲取代碼之后,進(jìn)入 WhihuqeabaLeelurlallball 文件夾

          可以通過這個簡單的例子試試效果

          原理

          本文使用的 PublishFolderCleaner 工具,在 GitHub 上完全開源,屬于我所在團(tuán)隊構(gòu)建工具鏈的工具,請看 https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK

          核心機(jī)制就是添加構(gòu)建調(diào)度步驟,在發(fā)布之后執(zhí)行移動文件和修改入口 exe 兩個步驟

          其中添加構(gòu)建調(diào)度的邏輯代碼如下

                
                <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>

          也就是在發(fā)布完成之后,通過 dotnet 命令調(diào)用 PublishFolderCleaner 工具,如上面代碼可以看到這是一個 .NET 5 的工具,要求當(dāng)前開發(fā)者的開發(fā)環(huán)境里面安裝有 .NET 5 才能執(zhí)行此工具

          在 PublishFolderCleaner 工具里面完成如上兩個步驟,將原有的放在發(fā)布文件夾里面的文件全部放入到里層的 lib 文件夾,再通過修改入口 exe 可執(zhí)行文件,也就是 AppHost 文件,讓入口 exe 從原本的相同文件夾讀取入口 dll 替換為從 lib 文件夾里面讀取入口 dll 文件

          關(guān)于修改 AppHost 文件的知識,請參閱 dotnet core 應(yīng)用是如何跑起來的 通過AppHost理解運行過程 和 dotnet 桌面端基于 AppHost 的配置式自動切換更新后的應(yīng)用程序路徑。

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  孕妇╳ⅹ孕交XXX | GOGO大胆无码人体免费视频 | 九哥操逼爱逼逼 | 未知 | 人妻久久久久免费肉丝足交 |