NuGet打包时,如何在MSBuild目标条件中检查路径含指定字符串?
解决MSBuild条件判断兼容性问题的替代方案
问题背景
打包NuGet包时,需根据程序集的.NET版本指定PackagePath:.NET Framework文件位于输出根目录,.NET Core(net7.0)文件位于net7.0/子文件夹。原条件判断逻辑在旧工具链下报错,因链式调用实例方法是MSBuild较新特性,旧版本不支持。
替代方案
方案1:使用MSBuild内置的Contains静态方法
MSBuild原生提供MSBuild类的静态Contains方法,语法符合旧版本工具链要求,兼容性更强:
'$([MSBuild]::Contains(%(NugetResourceContent.RecursiveDir), `$(DotNetVersion)`))' == 'true'
方案2:使用System.String的静态IndexOf方法
通过静态方法调用判断子串是否存在,完全兼容旧版MSBuild的语法规范:
'$([System.String]::IndexOf(%(NugetResourceContent.RecursiveDir), `$(DotNetVersion)`, System.StringComparison.Ordinal))' >= '0'
原方法报错原因
原代码$([System.String]::Copy(...)).Contains(...)属于实例方法链式调用,是MSBuild 16.8及以上版本才支持的新特性。旧版本工具链无法识别这种语法,会误报为找不到System.String.Copy方法(实际是不支持后续的实例方法调用逻辑)。
内容的提问来源于stack exchange,提问作者Benjin
相关产品推荐
相关产品推荐

