前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NetBeauty2:让你的.NET项目输出目录更清爽

NetBeauty2:让你的.NET项目输出目录更清爽

作者头像
沙漠尽头的狼
发布2024-03-21 14:25:50
1490
发布2024-03-21 14:25:50
举报
文章被收录于专栏:Dotnet9

在.NET项目开发中,随着项目复杂性的增加,依赖的dll文件也会逐渐增多。这往往导致输出目录混乱,不便于管理和部署。而NetBeauty2开源项目正是为了解决这一问题而生,它能够帮助开发者在独立发布.NET项目时,将.NET运行时和依赖的dll文件移动到指定的目录,从而让输出目录更加干净、清爽。

unsetunset1. NetBeauty2简介unsetunset

NetBeauty2是一个开源的.NET依赖库整理工具,它的主要作用是在.NET项目独立发布时,对输出目录进行整理和优化。通过NetBeauty2,开发者可以轻松地将.NET运行时和依赖的dll文件移动到指定的目录,使得项目的输出目录更加清晰、易于管理。

项目仓库地址:https://github.com/nulastudio/NetBeauty2[1]

下图为优化后输出目录(.NET运行时及引用依赖库移到libraries目录,目录名可配置):

下图为极限优化后输出目录(查看 `--hiddens`[2] 选项使用)

再来对比下未使用前输出目录(震撼吧!.NET运行时及相关依赖库全放在了根输出目录,.NET Framework可以配置privatePath,.NET Core可没那么方便):

unsetunset2. 支持情况unsetunset

NetBeauty 2[3]

NetCoreBeauty[4]

支持框架

.Net Framework .Net Core 3.0+

.Net Core 2.0+

支持部署模式

Framework-dependent deployment (FDD) Self-contained deployment (SCD) Framework-dependent executables (FDE)

Self-contained deployment (SCD)

支持操作系统

All

win-x64 win-x86 win-arm64(.NET 6+) linux-x64 linux-arm linux-arm64 osx-x64 osx-arm64(.NET 6+)

Need Patched HostFXR

No Yes(if use patch)

Yes

Minimum Structure

~20 Files ~8 Files(if use patch)

~8 Files

How It Works

`STARTUP_HOOKS`[5] `AssemblyLoadContext.Resolving`[6] `AssemblyLoadContext.ResolvingUnmanagedDll`[7] + `patched libhostfxr`[8](if use patch) `additionalProbingPaths`[9](if use patch)

`patched libhostfxr`[10] `additionalProbingPaths`[11]

Shared Runtime

Yes

Possible If Using patched libhostfxr Alone

unsetunset3. 如何使用?unsetunset

3.1. 准备工作

在你的.NET Core工程(需要发布的主工程)添加Nuget包:

代码语言:javascript
复制
dotnet add package nulastudio.NetBeauty

打开工程文件编辑(.csproj):

代码语言:javascript
复制
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

  <PropertyGroup>
    <BeautySharedRuntimeMode>False</BeautySharedRuntimeMode>
    <!-- beauty into sub-directory, default is libs, quote with "" if contains space  -->
    <BeautyLibsDir Condition="$(BeautySharedRuntimeMode) == 'True'">../libraries</BeautyLibsDir>
    <BeautyLibsDir Condition="$(BeautySharedRuntimeMode) != 'True'">./libraries</BeautyLibsDir>
    <!-- dlls that you don't want to be moved or can not be moved -->
    <!-- <BeautyExcludes>dll1.dll;lib*;...</BeautyExcludes> -->
    <!-- dlls that end users never needed, so hide them -->
    <!-- <BeautyHiddens>hostfxr;hostpolicy;*.deps.json;*.runtimeconfig*.json</BeautyHiddens> -->
    <!-- set to True if you want to disable -->
    <DisableBeauty>False</DisableBeauty>
    <!-- set to False if you want to beauty on build -->
    <BeautyOnPublishOnly>False</BeautyOnPublishOnly>
    <!-- DO NOT TOUCH THIS OPTION -->
    <BeautyNoRuntimeInfo>False</BeautyNoRuntimeInfo>
    <!-- set to True if you want to allow 3rd debuggers(like dnSpy) debugs the app -->
    <BeautyEnableDebugging>False</BeautyEnableDebugging>
    <!-- the patch can reduce the file count -->
    <!-- set to False if you want to disable -->
    <!-- SCD Mode Feature Only -->
    <BeautyUsePatch>True</BeautyUsePatch>
    <!-- App Entry Dll = BeautyDir + BeautyAppHostDir + BeautyAppHostEntry -->
    <!-- see https://github.com/nulastudio/NetBeauty2#customize-apphost for more details -->
    <!-- relative path based on AppHostDir -->
    <!-- .NET Core Non Single-File Only -->
    <!-- <BeautyAppHostEntry>bin/MyApp.dll</BeautyAppHostEntry> -->
    <!-- relative path based on BeautyDir -->
    <!-- .NET Core Non Single-File Only -->
    <!-- <BeautyAppHostDir>..</BeautyAppHostDir> -->
    <!-- <BeautyAfterTasks></BeautyAfterTasks> -->
    <!-- valid values: Error|Detail|Info -->
    <BeautyLogLevel>Info</BeautyLogLevel>
    <!-- set to a repo mirror if you have troble in connecting github -->
    <!-- <BeautyGitCDN>https://gitee.com/liesauer/HostFXRPatcher</BeautyGitCDN> -->
    <!-- <BeautyGitTree>master</BeautyGitTree> -->
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="nulastudio.NetBeauty" Version="2.1.4.4" />
  </ItemGroup>

</Project>

运行 dotnet build 或者 dotnet publish, 优化输出操作会自动完成。

3.2. 如果应用已经发布?

如果你的应用程序已经发布,可以这样使用(站长没试过,这可以做为发布后补偿措施):

代码语言:javascript
复制
Usage:
nbeauty2 [--loglevel=(Error|Detail|Info)] [--srmode] [--enabledebug] [--usepatch] [--hiddens=hiddenFiles] [--noruntimeinfo] [--roll-forward=<rollForward>] [--apphostentry=<appHostEntry>] [--apphostdir=<appHostDir>] <beautyDir> [<libsDir> [<excludes>]]

例如:

代码语言:javascript
复制
ncbeauty2 --usepatch --loglevel Detail --hiddens "hostfxr;hostpolicy;*.deps.json;*.runtimeconfig*.json" /path/to/publishDir libraries "dll1.dll;lib*;..."

3.3. 配置为.NET Core全局工具

代码语言:javascript
复制
dotnet tool install --global nulastudio.nbeauty

安装后在程序发布时会自动应用。

unsetunset4. 各种项目使用示例unsetunset

克隆仓库(https://github.com/nulastudio/NetBeauty2[12]),里面有各种模版项目使用示例:

测试工程名

说明

WPFTest

WPF项目(Winform类似),默认.NET 5

WebAppTest

RazorPages项目,默认.NET 6

NetFxTest

.NET Framework WPF项目(.NET 4.x,Winform类似)

ChromelyTest

引用了Chromely的.NET项目

AvaloniaTest

Avalonia UI项目,默认.NET 5

小知识1 Chromely NuGet包是一个用于创建跨平台桌面应用的库,它提供了一个基于Chromium的浏览器控件。通过Chromely,开发者可以使用Web技术(如HTML、CSS和JavaScript)来构建桌面应用的用户界面,同时保留对本地系统资源的访问。 Chromely NuGet包提供了一套完整的API和工具,使得开发者可以轻松地将Web应用程序转换为桌面应用程序,而无需进行大量的代码重写或修改。它还支持各种插件和扩展,以便开发者可以根据需要添加额外的功能或定制现有的功能。 此外,Chromely还支持多种编程语言和框架,如C#、.NET Core、ASP.NET Core等,这使得开发者可以选择他们最熟悉的技术栈来构建应用程序。

小知识2 Avalonia UI是一个跨平台的.NET UI框架,它允许开发者使用XAML和C#语言创建可在多个平台上运行的应用程序,包括Windows、Linux、macOS、iOS、Android以及WebAssembly。Avalonia UI旨在帮助开发者构建漂亮、现代的图形用户界面(GUI)。它兼容所有支持.NET Standard 2.0的平台,使开发者能够从单个代码库创建适用于多个操作系统的原生应用程序。通过使用Avalonia UI,开发者可以充分利用.NET生态系统的强大功能,同时实现跨平台兼容性,降低开发成本并提高开发效率。 推荐开源控件库:irihitech/Semi.Avalonia[13]irihitech/Ursa.Avalonia[14]

unsetunset5. 总结unsetunset

林德熙大佬分享过类似的包NuGet Gallery | dotnetCampus.PublishFolderCleaner 3.11.1[15],但该库说明只在Windows发布支持,大家可以对比使用,原文链接:PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁 - lindexi - 博客园 (cnblogs.com)[16],再次给出本文介绍库NetBeauty2开源地址:

项目仓库地址:https://github.com/nulastudio/NetBeauty2[17]

参考:

  • nulastudio/NetBeauty2: Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty. (github.com)[18]
  • 路遥工具箱 .NET 6.0 独立部署时优化目录结构-码农很忙 (coderbusy.com)[19]
  • PublishFolderCleaner 让你的 dotnet 应用发布文件夹更加整洁 - lindexi - 博客园 (cnblogs.com)[20]
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet9 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • unsetunset1. NetBeauty2简介unsetunset
  • unsetunset2. 支持情况unsetunset
  • unsetunset3. 如何使用?unsetunset
    • 3.1. 准备工作
      • 3.2. 如果应用已经发布?
        • 3.3. 配置为.NET Core全局工具
        • unsetunset4. 各种项目使用示例unsetunset
        • unsetunset5. 总结unsetunset
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档