美文网首页程序员码农的世界dotNET
.NET Core应用的三种部署方式

.NET Core应用的三种部署方式

作者: 雪飞鸿 | 来源:发表于2019-09-30 15:02 被阅读0次

    .NET Core应用提供了三种部署方式:

    FDD

    FDD:Framework-dependent deployment,框架依赖部署。这种方式针对某个特定版本的.NET Core进行发布,只打包应用本身及.NET Core类库之外的第三方依赖项,需要目标系统上已安装相应的.NET Core运行时。使用dotnet publish命令时,FDD是.NET Core 2.x的默认发布方式。

    除非特殊说明,FDD会使用目标系统上指定.NET Core版本的最新可用.NET Core runtime。

    FDE

    FDE:Framework-dependent executables,框架依赖可执行程序。这种方式针对某个特定版本的.NET Core及特定平台进行发布,只打包应用本身及.NET Core类库之外的第三方依赖项,需要目标系统上已安装相应的.NET Core运行时。FED适用于.NET Core 2.2及以上版本,是.NET Core 3.x的默认发布方式。使用dotnet publish命令(除.NET Core 3.x之外)以PDE模式发布应用,需指定下面两个参数:

    • -r <RID>

      该参数使用RID用于指定目标平台

    • --self-contained false

      该参数值为false时,.NET Core SDK会以FDE模式打包应用

    SCD

    SCD:Self-contained deployment,自包含部署。这种方式会将.NET Core运行时及.NET Core类库随应用一起打包,产生的文件数较多,占用磁盘空间较大,但无需目标系统安装.NET Core运行时。从.NET Core 2.0开始可以使用NET Core globalization invariant mode来减少磁盘空间的占用。

    使用dotnet publish命令(除.NET Core 3.x之外)以PDE模式发布应用,需指定下面两个参数:

    • -r <RID>

      该参数使用RID用于指定目标平台

    • --self-contained true

      该参数值为true时,.NET Core SDK会以SCD模式打包应用

    从.NET Core 2.1 SDK(2.1.300)开始,.NET Core支持patch version roll forward(翻译为补丁前滚?)在使用该模式进行打包时,.NET Core工具会自动选择指定.NET Core版本的最新可用.NET Core runtime。如果用于构建的机器上未安装指定.NET Core版本的最新.NET Core runtime,.NET Core工具会从NuGet.org上自行下载。所以,使用该模式进行打包可能会依赖网络。有关patch version roll forward,可参考: Self-contained deployment runtime roll forward

    命令示例

    Publish Mode SDK Version Command
    Framework-dependent deployment 2.x dotnet publish -c Release
    Framework-dependent executable 2.2 dotnet publish -c Release -r <RID> --self-contained false
    3.0 dotnet publish -c Release -r <RID> --self-contained false
    3.0* dotnet publish -c Release
    Self-contained deployment 2.1 dotnet publish -c Release -r <RID> --self-contained true
    2.2 dotnet publish -c Release -r <RID> --self-contained true
    3.0 dotnet publish -c Release -r <RID> --self-contained true

    可以使用dotnet publish --help命令来查看帮助文档:

    dotent_publish_help

    示例

    创建控制台应用(这里使用.NET Core 2.2):dotnet new console

    可以在项目文件(.csoroj)中看到使用dotnet publish发布应用时默认使用的目标框架:

    target_net_version

    可以将目标框架更改为任意被支持的Target Framework Moniker (TFM)。针对多个目标框架的发布,可参考:Publishing basicsHow to specify target frameworks

    FDD

    执行命令:dotnet publish -o pub -c Release

    可以看到文件夹中只有4个文件,占用8K磁盘空间:

    pub
    │   app.deps.json
    │   app.dll    
    |   app.pdb
    |   app.runtimeconfig.json
    
    FDE

    执行命令:dotnet publish -o pub -c Release -r win-x64 --self-contained false

    可以看到,相比FDD,文件夹中多了exe文件,共占用140K磁盘空间:

    pub
    │   app.deps.json
    │   app.dll    
    |   app.exe
    |   app.pdb
    |   app.runtimeconfig.json
    
    SCD

    执行命令:dotnet publish -o pub -c Release -r win-x64 --self-contained true

    文件夹中有217个文件,占用65.8M空间。

    小结

    FDD与FDE类似:只打包应用本身及.NET Core类库之外的第三方依赖项,都需要目标系统中已安装相应版本的运行时。但有以下不同:

    • FDE会生产可执行文件(如,Windows下的exe),可直接运行程序,FDD打包后则需要借助dotnet utility来启动,如:dotnet app.dll

    • 因为不同的系统的可执行程序格式不同,所以针对Windows系统以FDE模式打包应用无法直接放到Linux中运行。FDD只生成依赖特定运行时的程序集,只要目标系统中安装了相应的运行时,都可以运行打包后的程序,与系统无关。

    相比于FDD和FDE,SCD将应用、.NET Core运行时、.NET Core类库、第三方依赖均打包在一起,会产生一个比较大的包。因为自身已经包含了运行时,可以直接放到支持.NET Core的系统中运行,无论目标系统中是否已安装.NET Core运行时。SCD打包的应用自成一体,互相隔离、互不影响。

    FDE与SCD在打包时都会生产针对特定平台的可执行文件。所以,在使用dotnet publish命令时,需要指定-r <RID>参数。这里可执行文件的作用与dotnet命令类似,是启动.NET Core应用的HOST,在Windows中,可执行程序名称通常为:<PROJECT-FILE>.exe,.NET Core应用名为<PROJECT-FILE>.dll。

    推荐阅读

    .NET Core application deployment

    Publish .NET Core apps with the CLI

    Target frameworks

    Cross-platform targeting

    Developing Libraries with Cross Platform Tools

    相关文章

      网友评论

        本文标题:.NET Core应用的三种部署方式

        本文链接:https://www.haomeiwen.com/subject/cjthpctx.html