如何使用msbuild或dotnet渲染csproj文件(无需构建)
问题描述
我的Foo.csproj文件使用了MSBuild变量,示例代码如下:
<SolutionName>MyCompany</SolutionName> <Authors>$(SolutionName)</Authors>
我需要在构建脚本里拿到这些属性渲染后的实际值,本来试了MSBuild的命令:
msbuild -pp Foo.csproj
但这个命令只是合并配置,不会替换变量里的内容。想问下有没有办法拿到变量完全渲染后的XML?
环境:dotnet 6.0.302、msbuild 16.5.0.26101
(优先用内置解决方案,不想装第三方dotnet工具)
解决方案
方法1:临时目标文件提取单个属性值
不用修改原项目文件,先在当前目录新建一个getprop.targets文件,内容如下:
<Project> <Target Name="GetProp"> <Message Text="$(Authors)" Importance="High" /> <Exit Code="0" /> </Target> </Project>
然后执行命令:
msbuild Foo.csproj /nologo /t:GetProp /p:CustomBeforeMicrosoftCommonTargets=getprop.targets
直接就能看到Authors渲染后的结果。要获取其他属性的话,把目标里的$(Authors)换成对应的属性名即可。
方法2:生成完整的渲染后项目文件
如果需要整个项目的XML都替换变量,可以给Foo.csproj临时添加一个目标(用完后删掉即可):
<Target Name="ExportExpanded"> <!-- 替换需要展开的属性,这里以Authors为例 --> <XmlPoke XmlInputPath="Foo.csproj" Query="/Project/PropertyGroup/Authors" Value="$([MSBuild]::Escape($(Authors)))" /> <!-- 其他被变量引用的属性,都可以用同样的XmlPoke操作处理 --> <Copy SourceFiles="Foo.csproj" DestinationFiles="Foo.Expanded.csproj" /> </Target>
接着执行命令:
msbuild Foo.csproj /t:ExportExpanded
生成的Foo.Expanded.csproj就是所有指定变量替换后的完整XML文件。
方法3:从详细日志中提取值
要是懒得写额外文件,直接用详细日志输出,再过滤需要的属性:
msbuild Foo.csproj /v:d | findstr "Authors"
不过日志内容比较杂,得自己写脚本过滤出准确的属性值,适合简单场景快速查看。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

