大家都知道,在 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
// 忽略很多文件

代码

本文所有代码放在 githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 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 的配置式自动切换更新后的应用程序路径

PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁的更多相关文章

  1. 利用gulp把本地文件移动到指定待发布文件夹

    一.目标 把本地的文件移动到待发布的文件中,把static_grab文件中file.txt所列文件列表移动到beta对应文件夹中: 二.实现 var gulp = require('gulp'), w ...

  2. DeployMan,发布文件的利器

    利用Delphi开发app,有时候需要发布文件,如果文件少还不是问题,但文件多的情况下,IDE带的发布功能,就显得捉襟见肘,效率低下了. 通过Project-Deployment,打开发布窗口,如下图 ...

  3. Dynamics CRM ISV文件夹禁用后的解决方案

    众所周知微软在CRM2011的12补丁后取消了对ISV文件夹的支持,那我们自定义开发的一些web应用或者是想部署个服务该怎么办,有的选择了另开一个站点发布.我们以服务为例这样的另开站点的发布方式会导致 ...

  4. dotnet core 发布只带必要的依赖文件

    在使用 dotnet core 发布独立项目的时候,会带上大量依赖的库,但是通过微软提供的工具可以去掉一些在代码没有用到的库. 本文介绍的工具是 Microsoft.Packaging.Tools.T ...

  5. dotnet pack 打包文件版本号引起 "Could not load file or assembly" 问题

    如果不是遇到,真的不会想到,代码世界的问题真是千奇百怪,这次遇到的是 dotnet pack 打包文件版本号引起的问题. 之前进行 nuget 打包都是在 Visual Studio build 时进 ...

  6. 2019-10-4-C#-极限压缩-dotnet-core-控制台发布文件

    title author date CreateTime categories C# 极限压缩 dotnet core 控制台发布文件 lindexi 2019-10-04 14:59:36 +080 ...

  7. dotnet core 发布只有一个 exe 的方法

    在 dotnet core 发布的时候,会使用很多文件,这样发给小伙伴使用的时候不是很清真,本文告诉大家一个非官方的方法通过 warp 将多个文件打包为一个文件 和之前相同的方式发布一个 dotnet ...

  8. web发布 将各个文件夹输出合并到其自己的程序集 注意事项

    今天在发布web网站的时候 使用了“将各个文件夹输出合并到其自己的程序集”的选项,如图: 开始在 程序集前缀(可选)处,没有填写内容. 发布到IIS后出现未加载到程序集xxxx的错误. 经过各种调试, ...

  9. Visual Studio 2010 实用功能:使用web.config发布文件替换功能

    当建立ASP.NET Web应用程序项目后,默认除了生成web.config外,还生成了web.debug.config与Web.Release.config.顾名思义,根据它们的命名我可以推测到他们 ...

随机推荐

  1. 源码解析.Net中Middleware的实现

    前言 本篇继续之前的思路,不注重用法,如果还不知道有哪些用法的小伙伴,可以点击这里,微软文档说的很详细,在阅读本篇文章前,还是希望你对中间件有大致的了解,这样你读起来可能更加能够意会到意思.废话不多说 ...

  2. 【详细、开箱即用】.NET企业微信回调配置(数据回调URL和指令回调URL验证)

    前言: 前段时间因为公司业务需求,需要将微信小程序与企业微信对接通,也就是把小程序绑定到对应的企业微信账号下,在该企业微信的用户可以将该小程序绑定到工作台中,然后可以在工作台中打开该小程序并授权.不过 ...

  3. 学习笔记之IdentityServer4(一)

    快速入门IdentityServer4 概述 将 IdentityServer 添加到 ASP.NET Core 应用程序 配置 IdentityServer 为各种客户发行代币 保护 Web 应用程 ...

  4. mysqli的基本使用

    简单实例 面向过程方式 // 创建数据库连接 $connect = mysqli_connect('127.0.0.1', 'root', 'root', 'test', 8889); // 判读是否 ...

  5. Linux - centos7.X 安裝 Python 3.7

    说明 全部操作都在 root 用户下执行 安装编译相关工具 yum -y groupinstall "Development tools" yum -y install zlib- ...

  6. app自动化定位:UIautomation的用法

    UIautomation定位的优点: 速度比xpath定位快,UIautomation是Android的工作引擎 缺点: 没有idea提示 UIautomation使用方法: AndroidDrive ...

  7. java 多线程Thread和Runnable的区别

    如果一个类继承Thread,则不适合资源共享.但是如果实现了Runable接口的话,则很容易的实现资源共享 实现Runnable接口比继承Thread类所具有的优势:1. 适合多个相同的程序代码的线程 ...

  8. LeetCode刷题模板(1):《我要打10个》之二分法

    Author       :  叨陪鲤 Email         : vip_13031075266@163.com Date          : 2021.01.23 Copyright : 未 ...

  9. 动态路由——OSPF

    目录: 一. OSPF路由协议概述     1,OSPF协议    2,内部网关协议和外部网关协议   3,OSPF的工作过程 二.OSPF基本概念   1,OSPF区域   2,区域ID   3,R ...

  10. 理解ASP.NET Core - [04] Host

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 本文会涉及部分 Host 相关的源码,并会附上 github 源码地址,不过为了降低篇幅,我会 ...