发布时如何定位特定的.NET Core运行时?

时间:2018-11-27 19:59:58

标签: build .net-core runtime-identifier

发布.NET Core应用程序时,它会输出一个带有以下子目录的runtimes目录:

- publish/runtimes/
   - debian.8-x64/
   - fedora.23-x64/
   - fedora.24-x64/
   - opensuse.13.2-x64/
   - opensuse.42.1-x64/
   - osx/
   - osx.10.10-x64/
   - rhel.7-x64/
   - ubuntu.14.04-x64/
   - ubuntu.16.04-x64/
   - ubuntu.16.10-x64/
   - unix/
   - win/

在我的CI / CD服务器上,我使用以下命令发布应用程序:

dotnet publish -c Release -o ..\publish

我在项目文件中的发布设置如下:

  • 目标框架:netcoreapp2.1
  • 部署模式:取决于框架
  • 目标运行时:win-x64

我只打算在Windows 2016 Server上发布此应用程序,因此不需要OSX / Linux / Unix runtimes文件夹。在某些情况下,这些runtimes文件夹包含已知的易受攻击的dlls文件夹,这种情况更糟,这会导致OSA扫描误报。

是否可以将项目配置为仅输出win运行时文件夹?

更新

我尝试了@ahsteele的建议,将RID添加到我的csproj文件的输出与未指定RID的输出相同。

当我运行CI / CD命令示例时

dotnet publish -c Release -r win10-x86 -o ..\publish

我相信它会创建一个独立的部署。当我的发布目录从55MB增加到120MB,从237个文件增加到482个文件。

更新2

我尝试为发布步骤指定启动项目,它可以使运行时目录更紧凑。

这是我正在运行的构建命令:

dotnet publish .\startupProject.csproj -c Release -o ..\publish

这是输出:

- publish/runtimes/
   - unix/
   - win/

我的解决方案中的某些项目确实指定了netstandard2.0,而某些项目指定了netcoreapp2.0。如果您没有指定目标框架或特定的csproj文件,Microsoft是否会在任何地方进行文档编制,它将为您提供所有可能的运行时的所有目标框架?

1 个答案:

答案 0 :(得分:2)

您应该可以使用dotnet publish -r开关指定运行时。在.NET Core RID Catalog - Windows RIDs中,Windows 10 / Windows Server 2016 RID为:

  • win10-x64
  • win10-x86
  • win10臂
  • win10-arm64

意味着您的CI / CD命令可以指定运行时:

dotnet publish -c Release -r win10-x86 -o ..\publish

或者,可以在项目文件的<RuntimeIdentifier>元素中设置一个RID:

<RuntimeIdentifier>win10-x64</RuntimeIdentifier>

可以在项目文件的<RuntimeIdentifiers>元素中将多个RID定义为以分号分隔的列表:

<RuntimeIdentifiers>win10-x64;win10-x86</RuntimeIdentifiers>