PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁
大家都知道,在 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
// 忽略很多文件
代码
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 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 应用发布文件夹更加整洁的更多相关文章
- 利用gulp把本地文件移动到指定待发布文件夹
一.目标 把本地的文件移动到待发布的文件中,把static_grab文件中file.txt所列文件列表移动到beta对应文件夹中: 二.实现 var gulp = require('gulp'), w ...
- DeployMan,发布文件的利器
利用Delphi开发app,有时候需要发布文件,如果文件少还不是问题,但文件多的情况下,IDE带的发布功能,就显得捉襟见肘,效率低下了. 通过Project-Deployment,打开发布窗口,如下图 ...
- Dynamics CRM ISV文件夹禁用后的解决方案
众所周知微软在CRM2011的12补丁后取消了对ISV文件夹的支持,那我们自定义开发的一些web应用或者是想部署个服务该怎么办,有的选择了另开一个站点发布.我们以服务为例这样的另开站点的发布方式会导致 ...
- dotnet core 发布只带必要的依赖文件
在使用 dotnet core 发布独立项目的时候,会带上大量依赖的库,但是通过微软提供的工具可以去掉一些在代码没有用到的库. 本文介绍的工具是 Microsoft.Packaging.Tools.T ...
- dotnet pack 打包文件版本号引起 "Could not load file or assembly" 问题
如果不是遇到,真的不会想到,代码世界的问题真是千奇百怪,这次遇到的是 dotnet pack 打包文件版本号引起的问题. 之前进行 nuget 打包都是在 Visual Studio build 时进 ...
- 2019-10-4-C#-极限压缩-dotnet-core-控制台发布文件
title author date CreateTime categories C# 极限压缩 dotnet core 控制台发布文件 lindexi 2019-10-04 14:59:36 +080 ...
- dotnet core 发布只有一个 exe 的方法
在 dotnet core 发布的时候,会使用很多文件,这样发给小伙伴使用的时候不是很清真,本文告诉大家一个非官方的方法通过 warp 将多个文件打包为一个文件 和之前相同的方式发布一个 dotnet ...
- web发布 将各个文件夹输出合并到其自己的程序集 注意事项
今天在发布web网站的时候 使用了“将各个文件夹输出合并到其自己的程序集”的选项,如图: 开始在 程序集前缀(可选)处,没有填写内容. 发布到IIS后出现未加载到程序集xxxx的错误. 经过各种调试, ...
- Visual Studio 2010 实用功能:使用web.config发布文件替换功能
当建立ASP.NET Web应用程序项目后,默认除了生成web.config外,还生成了web.debug.config与Web.Release.config.顾名思义,根据它们的命名我可以推测到他们 ...
随机推荐
- 并发编程之:AQS源码解析
大家好,我是小黑,一个在互联网苟且偷生的农民工. 在Java并发编程中,经常会用到锁,除了Synchronized这个JDK关键字以外,还有Lock接口下面的各种锁实现,如重入锁ReentrantLo ...
- Windows系统定时备份MySQL数据库
当一个网站投入使用时,定期备份数据库是必要的事.那么,在Windows系统上,我们该如何做呢? 如下语句可以实现备份及还原MySQL数据库: 备份MySQL数据库 mysqldump -uroot - ...
- JUC原子操作类与乐观锁CAS
JUC原子操作类与乐观锁CAS 硬件中存在并发操作的原语,从而在硬件层面提升效率.在intel的CPU中,使用cmpxchg指令.在Java发展初期,java语言是不能够利用硬件提供的这些便利来提 ...
- 洛谷P3130 haybalesCounting Haybale P 题解
题目 [USACO15DEC]haybalesCounting Haybale P 题解 最近刚刚自学了线段树这个数据结构,恰巧做到了这道线段树的模板题.其实也没有什么好多说的,接触过线段树的大犇肯定 ...
- Lucene入门及实际项目应用场景
导入maven依赖 <dependency> <groupId>org.apache.lucene</groupId> <artifactId>luce ...
- 【第一篇】- Git 教程之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 教程 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制 ...
- 集合Collection ----List集合
Collection集合体系的特点: set系列集合:添加的元素是 无序,不重复,无索引的 ----HashSet: 无序,不重复,无索引 ----LinkedHashSet: 有序,不重复,无索引 ...
- vijos题解
Vijos题解 题库地址:https://vijos.org/p P1001 谁拿了最多奖学金 题意:按照指定要求计算奖学金,直接用if判断即可 #include<iostream> us ...
- UI自动化测试:App的Webview页面元素左滑
一.前言 在做App自动化测试时,我们会遇到如上图所示的列表数据页面左滑删除场景,一般可以通过location.rect方法获取对应列表的元素坐标,然后使用TouchAction或者swipe滑动 ...
- django如何加载外部文件
django如何加载外部文件(环境:pycharm python2.7 django1.11) 有一份新的文件夹名为:py_aiplat_demo,内含有多个文件夹(SDK,demo,data). 1 ...