内容目录
在 .csproj 中使用了中文,导致 Jenkins CICD 的时候报错。
Microsoft.WinFX.targets(439,8): error : Invalid character in the given encoding.
原因在于 MSBuild 或者 dotnet publish 使用的编码集合为 utf8。
保存 .csproj 文件时,要使用 utf-8 bom,里面的字符要使用 utf8。
而 powershell 中默认是 GB2312 编码,所以会导致报错。
另一个问题,由于需求,需要在 CICD 时,动态修改程序集名称:
<AssemblyName>程序集名称</AssemblyName>
$content = Get-Content -Path "${env:P_NAME}.csproj" ;
$updatedContent = $content -replace '(?<=<AssemblyName>).+?(?=</AssemblyName>)', ${env:APP_NAME} ;
Set-Content -Path "${env:P_NAME}.csproj" -Value $updatedContent ;
但是因为在 powershell 里面,默认编码是 GB2312,所以直接替换之后,文件虽然还是 utf8,但是替换的字符是 GB2312,所以编译会报错。
网上找到的方法是使用 chcp 修改当前终端字符集编码,实际上没有任何效果。
chcp 65001 ;
实际上应该在读取写入文本时使用 -encoding utf8
,将编码设置为 utf8。
$content = Get-Content -Path "${env:P_NAME}.csproj" -encoding utf8;
$updatedContent = $content -replace '(?<=<AssemblyName>).+?(?=</AssemblyName>)', ${env:APP_NAME} ;
Set-Content -Path "${env:P_NAME}.csproj" -Value $updatedContent -encoding utf8;
这样,无论读取还是修改,文本传递的时候都是 utf8 编码。
文章评论