用 dotnet 命令发布程序
2024-11-04 23:14:26
很久以前,发布程序都是将配置改为 Release 编译一下,得到二进制文件打包给客户,这个习惯一直延续至今。
好像是从 .NET Core 时代开始,微软为了跨平台搞了个推出了一个发布
的概念,也就是在编译
后多了一个打包的过程。
dotnet 命令行发布
废话不多说,先看一条发布命令:
1 | dotnet publish MyProject -c Release -f net8.0-windows -r win-x64 --sc false -o ./publish -p:Platform=x64 -p:PublishSingleFile=true |
参数 | 对应MSBuild属性 | 说明 |
---|---|---|
-c | Configuration | 解决方案配置,一般就是Debug 或Release。 |
-f | TargetFramework | TargetFrameworks 中的值之一。 |
-r | RuntimeIdentifier | 影响 nuget 包将哪些附件复制到输出目录。 |
–sc | SelfContained | true表示将依赖的.NET框架文件一并复制到发布目录,文件夹会非常大。但是不用再安装运行库。 |
-o | PublishDir | 发布目录位置。 |
-p:Platform | Platform | 解决方案平台,一般就是AnyCPU 、x86 、x64 、ARM32 、AMR64 。 |
-p:PublishSingleFile | PublishSingleFile | 是否将托管 DLL 文件合并为一个 exe 文件,这样发布目录会很干净,不会有大量 DLL 文件。 |
可以输入dotnet publish /?
查看详细的说明。
1 | Description: |
.pubxml 文件发布
在 Visual Studio 中右键选择项目,点击发布
也可以用向导方式发布程序
然后项目文件夹Properties\PublishProfiles
下会生成相应的.pubxml
文件。
1 | <Project> |
还可以用命令行来引用.pubxml
文件来发布
1 | dotnet publish MyProject -p:PublishProfile=FolderProfile |
但是我个人不推荐这么做,因为dotnet
不会去读取某些属性值,MSDN 上说的:
.pubxml 文件中的某些属性仅受 Visual Studio 使用,对 dotnet publish 没有影响。 我们正在努力使 CLI 与 Visual Studio 的行为更加一致。 但 CLI 永远不会使用某些属性。 CLI 和 Visual Studio 都执行发布的打包方面,dotnet/sdk#29817 计划添加对更多与此相关的属性的支持。 但 CLI 不执行发布时部署自动化方面的操作,与此相关的属性不受支持。 不支持的最值得注意的 .pubxmldotnet publish 属性是影响生成的以下属性:
- LastUsedBuildConfiguration
- Configuration
- Platform
- LastUsedPlatform
- TargetFramework
- TargetFrameworks
- RuntimeIdentifier
- RuntimeIdentifiers
所以我还是喜欢用命令行的方式发布。
总结
简单地说,发布
的最终目的就是为了以下三个功能:
- SelfContained。决定是否将 .NET 运行库文件一并打包,这样客户机可以避免安装 .NET 运行时。
- PublishSingleFile。决定是否将所以依赖的程序集文件合并到一个可执行文件中。
- PublishAot。是否启用 AOT 编译,生成的文件是非托管文件,不依赖 .NET 运行时,和 C/C++ 一样,一般用于 DLL 项目。