8

当我发布我的 .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 上发布此应用程序,因此runtimes不需要 OSX/Linux/Unix 文件夹。更糟糕的是,在某些情况下,这些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 是否会在任何地方记录,它将为您提供所有可能的运行时的所有目标框架?

4

1 回答 1

3

您应该能够使用dotnet publish -r开关指定您的运行时。从.NET Core RID 目录 - Windows RID中,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>

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

<RuntimeIdentifiers>win10-x64;win10-x86</RuntimeIdentifiers>
于 2018-11-28T06:15:20.183 回答