如何在MSBuild调用时覆盖csproj.user文件?
解决构建服务器覆盖csproj用户配置的替代方案
不用纠结复制文件的方式,有几个更干净且不修改源码树的方案:
直接通过MSBuild命令行参数覆盖属性
这是最直接的方式,不需要任何额外文件,在构建命令里用/p(或/property)参数指定要覆盖的属性即可。比如构建服务器需要修改输出路径和关闭调试符号:
msbuild MyProject.csproj /p:OutputPath=./bin/ServerBuild /p:DebugSymbols=false /p:DebugType=none
所有在csproj.user里配置的属性,几乎都能通过这种方式直接覆盖,完全不影响源码目录的任何文件。
用独立的.props文件导入配置
把构建服务器的专属配置写到一个单独的.props文件(比如BuildServerSettings.props),放在构建服务器的非源码目录下,构建时通过/import参数引入这个文件:
msbuild MyProject.csproj /import:"D:\BuildConfigs\BuildServerSettings.props"
.props文件的内容示例:
<Project> <PropertyGroup> <!-- 覆盖输出路径 --> <OutputPath>$(MSBuildProjectDirectory)\bin\Server</OutputPath> <!-- 禁用调试信息 --> <DebugType>none</DebugType> <!-- 修改其他需要的属性 --> <WarningLevel>3</WarningLevel> </PropertyGroup> </Project>
这种方式适合把服务器的配置集中管理,修改起来更方便,而且同样不会触碰源码树。
利用MSBuild全局配置文件(全局生效场景)
如果构建服务器上所有项目都需要统一的配置,可以在服务器上配置MSBuild的全局属性文件。MSBuild会自动加载以下位置的全局配置:
%ProgramFiles(x86)%\MSBuild\<MSBuild版本>\Microsoft.Common.props- 用户目录下的
%USERPROFILE%\MSBuild\Current\Microsoft.Common.props
在这些文件里加入需要覆盖的属性,就能对所有在该服务器上构建的项目生效。不过注意这是全局设置,只适合所有项目都需要相同配置的场景。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

