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
浙公网安备 33010602011771号