You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dotnet build与dotnet test的-o参数处理是否存在差异?

问题:Docker中dotnet test指定-o参数路径异常的原因?

我的Dockerfile内容如下:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR "/src"

COPY ["ProjectName/ProjectName.csproj", "ProjectName/"]
RUN dotnet restore "ProjectName/ProjectName.csproj"
COPY . .
WORKDIR "/src/ProjectName"
RUN dotnet build "ProjectName.csproj" -c Release -o /app/build

FROM build AS test
ENTRYPOINT ["dotnet", "test", "ProjectName.csproj", "-c:Release", "-o:\"/app/build\"", "--no-build"]

我的思路是构建时将二进制文件存到/app/build目录,执行dotnet test时通过-o:"/app/build"指定输出目录,并用--no-build避免重复构建。镜像构建正常,进入容器能确认程序集在/app/build,但执行测试时报错:

Test run for /src/ProjectName/app/build/ProjectName.dll (.NETCoreApp,Version=v6.0)
Microsoft (R) Test Execution Command Line Tool Version 17.2.0 (x64)
Copyright (c) Microsoft Corporation. All rights reserved.
The argument /src/ProjectName/app/build/ProjectName.dll is invalid. Please use the /help option to check the list of valid arguments.

发现程序把-o:/app/build当成了相对路径,附加到当前目录/src/ProjectName后形成了错误路径/src/ProjectName/app/build/ProjectName.dll。我可以不指定输出目录规避问题,但想知道这是.NET CLI的bug还是我的配置有误?


原因分析与解决办法

这是你的配置错误,和.NET CLI无关,问题出在Docker ENTRYPOINT的参数写法上:

  1. Docker ENTRYPOINT使用数组格式(exec模式)时,不会经过shell解析,因此不需要给路径添加引号,也不需要转义引号。你写的-o:\"/app/build\"会被直接作为一个完整参数传递给dotnet test,即参数内容是-o:"/app/build"。
  2. .NET CLI解析这个参数时,会把-o:后面的"/app/build"(包含引号)作为输出目录。由于引号不属于合法的路径字符,CLI解析时错误地处理了这个值,最终把/app/build变成了相对路径app/build,导致它在当前工作目录/src/ProjectName下去找这个路径,从而生成了错误的/src/ProjectName/app/build/ProjectName.dll路径。

修正后的两种写法:

  • 写法一:将-o和路径作为独立参数
ENTRYPOINT ["dotnet", "test", "ProjectName.csproj", "-c:Release", "-o", "/app/build", "--no-build"]
  • 写法二:使用-o=/app/build格式(不需要引号)
ENTRYPOINT ["dotnet", "test", "ProjectName.csproj", "-c:Release", "-o=/app/build", "--no-build"]

两种写法都能让.NET CLI正确识别/app/build这个绝对路径,从而找到正确的测试程序集。

内容的提问来源于stack exchange,提问作者aa_talanin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:36:26