SW 随笔 004 — C# 项目 修改输出目录 的正确姿势

声明:个人笔记,概不负责

答案(可抄)

.csproj 文件所在目录,建一个 Directory.Build.props 文件,然后这么整 —— 无脑拷贝。

唯一 用脑子的地方,就是把 Build 改成实际需要的。(别动 Build 右边,可以动 左边 和 Build 自己)

<!-- Directory.Build.props -->

<Project>
	<PropertyGroup>
		<ArtifactsRoot>$(MSBuildThisFileDirectory)../../Build/$(MSBuildProjectName)/</ArtifactsRoot>
		
		<MSBuildProjectExtensionsPath>$(ArtifactsRoot).nuget/</MSBuildProjectExtensionsPath>
		<IntermediateOutputPath>$(ArtifactsRoot)obj/</IntermediateOutputPath>
		<OutputPath>$(ArtifactsRoot)bin/</OutputPath>
	</PropertyGroup>
</Project>

啰嗦的解释

好没养分,但 好奇的猫 都想知道。

因为 MSBuildProjectExtensionsPath 只能在这里改,不能在 .csproj 文件里改。

因为若 IntermediateOutputPath 改了,就必须要改 MSBuildProjectExtensionsPath

因为不改 IntermediateOutputPath 的话,有些时候(有些人)会浑身不舒服

差不多就是说 Directory.Build.props 是想玩花活的 第一站,否则就老老实实的在 .csproj 里 只能看不能动。

(连环套)

因为 Copilot 说,

MSBuild 加载顺序是:
  <Project Sdk="...">
  自动导入 Microsoft.Common.props
  然后才导入 Directory.Build.props(按从上到下查找父目录)
  再加载 csproj 内容
  最后加载 Directory.Build.targets

我的推论(reviewed by Copilot)
    推论(根据 MSBuild 加载顺序)
      - 在 .csproj 中不能直接设置 MSBuildProjectExtensionsPath 
        (Copilot 说)因为 NuGet Restore 早于 .csproj 生效。
      - (脑回路正常的话)就必须弄个 Directory.Build.props 出来
      - 也就是讲,想改项目的输出目录,最佳方式就是造个 Directory.Build.props 
        这样一来 nuget obj bin 都没烦恼

=== 短平快的 结束线 2025-12-28

posted @ 2025-12-29 14:50  悠洋洋  阅读(2)  评论(0)    收藏  举报