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

.NET Core发布时OutDir/OutPath未正确设置的问题求助

解决dotnet publish -o指定目录后MSBuild $(OutDir)未更新的问题

我明白你遇到的困扰了——当你执行dotnet publish -o ./dist指定发布目录时,MSBuild的$(OutDir)和$(OutputPath)依然指向默认的bin/Release/netcoreapp2.0/,导致你的模板复制Target没能把文件放到预期的dist目录里。

问题根源

这里的核心是混淆了MSBuild中两个不同的输出属性:

  • $(OutDir)/$(OutputPath):这是构建(build)阶段的输出目录,dotnet publish会先完成编译构建,把产物放到这个目录,之后再将需要发布的文件复制到最终的发布目录。
  • $(PublishDir):这才是发布阶段的输出目录,对应你通过-o参数指定的路径,也就是你期望的./dist。

解决方案

把你的Target里的$(OutDir)替换成$(PublishDir)即可,修改后的CopyEmailTemplates Target如下:

<Target Name="CopyEmailTemplates" AfterTargets="AfterPublish">
  <ItemGroup>
    <TemplatesFolder Include="Views\EmailTemplates\*.cshtml" />
  </ItemGroup>
  <Copy SourceFiles="@(TemplatesFolder)" DestinationFolder="$(PublishDir)Views\EmailTemplates\" />
</Target>

同时,你可以更新OutputTest Target来验证$(PublishDir)的值:

<Target Name="OutputTest" AfterTargets="AfterPublish">
  <Exec Command="echo OutPath: $(OutputPath)" />
  <Exec Command="echo OutDir: $(OutDir)" />
  <Exec Command="echo PublishDir: $(PublishDir)" />
</Target>

执行dotnet publish -o ./dist后,你会看到PublishDir正确指向./dist/(或系统解析后的绝对路径)。

额外说明

在.NET Core的MSBuild逻辑里,AfterPublish Target确实是在所有发布文件复制到$(PublishDir)之后执行的,所以用这个时机配合$(PublishDir)就能准确把你的模板文件复制到发布目录中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:30:15