"dotnet publish" dotnetcoresdk 容器中的命令生成没有详细信息的 EXE
"dotnet publish" command within dotnetcoresdk container produces EXE without Details
我们正在尝试使用 dotnet publish
、dotnet build
或 dotnet msbuild
命令在容器中构建 .NET core 3.1 应用程序,并使用不同的参数。这成功了,但问题是 EXE 输出从不显示任何文件详细信息(版权、文件版本等为空),而 DLL 确实包含指定信息。我们已经尝试了几种不同的容器,以及在线研究和尝试不同的命令参数,用于版本控制(有一些)。此外,运行直接在我的 Windows 10 机器上使用相同的 dotnet publish 命令,按预期工作,没有问题。
我也尝试过将 dotnet build
和 dotnet publish
(--no-build
) 命令分开,并在它们之间复制一个代码签名的 EXE,以防出现信任问题,但没有成功了。
Dockerfile 内容(也使用 dotnet publish
而不是 msbuild
):
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine3.11
ARG Version="5.6.7"
WORKDIR /build
COPY ./src $WORKDIR
RUN dotnet restore
RUN echo $Version
RUN dotnet msbuild abc.csproj /t:Build /p:PublishSingleFile=True /p:SelfContained=True /p:PublishProtocol=FileSystem /p:Configuration=Release /p:Platform=x64 /p:TargetFrameworks=netcoreapp3.1 /p:PublishDir=publish /p:RuntimeIdentifier=win-x64 /p:PublishReadyToRun=False /p:PublishTrimmed=False /p:VersionNumber=$Version /p:VersionPrefix=$Version /p:Version=$Version /p:AssemblyVersion=$Version /p:AssemblyVersionAttribute=$Version /p:FileVersion=$Version /p:AssemblyFileVersionAttribute=$Version
重现步骤:
- 创建 Dockerfile,与上面类似
- 运行 docker .NET Core 控制台应用程序的构建命令(替换 abc.csproj)
- 运行 docker 运行 命令使用容器 ID
- 将发布内容复制到本地文件系统并查看 EXE 文件详细信息
我认为有一个 issue 仍然开放,我认为你应该看看你的 Container 和 Windows 之间的 SDK
版本有什么不同并尝试使用您容器中的那个工作版本
此处描述了此问题:https://github.com/dotnet/sdk/issues/4127。从那个 link:
The PE resources are transferred from App.dll to the host App.exe only
when building on Windows -- because the resource handling code
currently uses native Win32 API. So, when the app is published from
Linux or nanoserver, the resources are not transfered.
该问题已关闭,指向计划 cross-platform 工作 re-write 这些资源的编写方式 (https://github.com/dotnet/runtime/issues/3828)。这项工作已被推迟到 dotnet 6.0.0 里程碑,所以不幸的是,目前让 .exe 包含这些程序集信息资源的唯一方法是 运行 dotnet publish
命令直接在 Windows 主机.
在这个帖子中,我为自己找到了一个解决方案,它也解决了这里讨论的问题:
TL;DR
nanoserver
图像是问题所在(它是标准 .NET 核心图像的基础)
- 使用
mcr.microsoft.com/dotnet/sdk:5.0-windowsservercore-ltsc2019
作为图像,它使用servercore
我们正在尝试使用 dotnet publish
、dotnet build
或 dotnet msbuild
命令在容器中构建 .NET core 3.1 应用程序,并使用不同的参数。这成功了,但问题是 EXE 输出从不显示任何文件详细信息(版权、文件版本等为空),而 DLL 确实包含指定信息。我们已经尝试了几种不同的容器,以及在线研究和尝试不同的命令参数,用于版本控制(有一些)。此外,运行直接在我的 Windows 10 机器上使用相同的 dotnet publish 命令,按预期工作,没有问题。
我也尝试过将 dotnet build
和 dotnet publish
(--no-build
) 命令分开,并在它们之间复制一个代码签名的 EXE,以防出现信任问题,但没有成功了。
Dockerfile 内容(也使用 dotnet publish
而不是 msbuild
):
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine3.11
ARG Version="5.6.7"
WORKDIR /build
COPY ./src $WORKDIR
RUN dotnet restore
RUN echo $Version
RUN dotnet msbuild abc.csproj /t:Build /p:PublishSingleFile=True /p:SelfContained=True /p:PublishProtocol=FileSystem /p:Configuration=Release /p:Platform=x64 /p:TargetFrameworks=netcoreapp3.1 /p:PublishDir=publish /p:RuntimeIdentifier=win-x64 /p:PublishReadyToRun=False /p:PublishTrimmed=False /p:VersionNumber=$Version /p:VersionPrefix=$Version /p:Version=$Version /p:AssemblyVersion=$Version /p:AssemblyVersionAttribute=$Version /p:FileVersion=$Version /p:AssemblyFileVersionAttribute=$Version
重现步骤:
- 创建 Dockerfile,与上面类似
- 运行 docker .NET Core 控制台应用程序的构建命令(替换 abc.csproj)
- 运行 docker 运行 命令使用容器 ID
- 将发布内容复制到本地文件系统并查看 EXE 文件详细信息
我认为有一个 issue 仍然开放,我认为你应该看看你的 Container 和 Windows 之间的 SDK
版本有什么不同并尝试使用您容器中的那个工作版本
此处描述了此问题:https://github.com/dotnet/sdk/issues/4127。从那个 link:
The PE resources are transferred from App.dll to the host App.exe only when building on Windows -- because the resource handling code currently uses native Win32 API. So, when the app is published from Linux or nanoserver, the resources are not transfered.
该问题已关闭,指向计划 cross-platform 工作 re-write 这些资源的编写方式 (https://github.com/dotnet/runtime/issues/3828)。这项工作已被推迟到 dotnet 6.0.0 里程碑,所以不幸的是,目前让 .exe 包含这些程序集信息资源的唯一方法是 运行 dotnet publish
命令直接在 Windows 主机.
在这个帖子中,我为自己找到了一个解决方案,它也解决了这里讨论的问题:
TL;DR
nanoserver
图像是问题所在(它是标准 .NET 核心图像的基础)- 使用
mcr.microsoft.com/dotnet/sdk:5.0-windowsservercore-ltsc2019
作为图像,它使用servercore