MSB4184错误求助:构建时[System.Version]::Parse('')无法求值
问题根源
该错误来自GitInfo 2.2.0包的_EnsureGit目标:当执行git --version的输出无法被正则\d+\.\d+\.\d+匹配到有效版本号时,_GitCurrentVersion会变成空字符串,导致System.Version.Parse调用失败。多次构建偶尔成功是因为Git输出偶尔符合正则匹配预期,但不稳定。
解决方案
升级GitInfo包到最新版本
旧版本的正则匹配逻辑存在兼容性问题,升级到最新版(截至当前v3.0.0+)可修复多数场景下的匹配问题。直接在NuGet包管理器中更新GitInfo即可。调整Git版本匹配正则(适配本地化/特殊输出)
若Git输出因语言环境或版本格式特殊(如带Windows后缀的2.45.1.windows.1),可在项目的.csproj或Directory.Build.props中添加自定义正则:<PropertyGroup> <!-- 适配带后缀的Git版本输出,捕获核心版本号 --> <GitVersionRegex>\d+\.\d+\.\d+</GitVersionRegex> <!-- 或针对完整输出格式匹配 --> <!-- <GitVersionRegex>git version (\d+\.\d+\.\d+)</GitVersionRegex> --> </PropertyGroup>若自定义参数不生效,可直接修改本地
\.nuget\packages\gitinfo\2.2.0\build\GitInfo.targets中的正则:
将\d+\.\d+\.\d+替换为\d+\.\d+\.\d+(\.\w+)?,增强匹配鲁棒性。强制Git使用英文输出
系统语言导致Git输出本地化(罕见,但可能影响正则)时,全局设置Git语言为英文:git config --global core.ui en_US.UTF-8或在VS开发者命令行中临时设置环境变量后构建:
set LANG=en_US.UTF-8 msbuild YourSolution.sln跳过Git版本检查(临时应急方案)
若无需版本校验,可在项目文件中添加参数跳过检查:<PropertyGroup> <SkipGitVersionCheck>true</SkipGitVersionCheck> </PropertyGroup>或直接注释掉
GitInfo.targets中_EnsureGit目标里的版本检查Error节点:<!-- 注释掉该行即可跳过版本检查 --> <!-- <Error Condition="$([System.Version]::Parse('$(_GitCurrentVersion)').CompareTo($([System.Version]::Parse('$(GitMinVersion)')))) &lt; 0" Text="Required minimum git version is $(GitMinVersion) but found $(_GitCurrentVersion)." /> -->指定GitExe的完整路径
确保MSBuild调用的是正确的Git版本,避免路径问题导致输出异常:<PropertyGroup> <GitExe>C:\Program Files\Git\bin\git.exe</GitExe> </PropertyGroup>替换为你本地Git的实际安装路径。
内容的提问来源于stack exchange,提问作者stephenspcdmav

