如何用MSBuild读取含换行符的文本文件并生成对应版本属性
解决MSBuild读取换行文本并生成指定属性组的问题
需求说明
- 读取包含换行的文本文件,文件内容如下:
Prod;2.13 Pre-Prod;2.14 Test;2.15
- 期望生成如下属性组:
<PropertyGroup> <_ProdVersion>2.13</_ProdVersion> <_PreProdVersion>2.14</_PreProdVersion> <_TestVersion>2.15</_TestVersion> </PropertyGroup>
- 现有代码已使用
ReadLinesFromFile读取文件,但无法正确拆分每行并生成对应属性,现有代码:
<ReadLinesFromFile Condition="'$(Configuration)' == 'Debug'" File="$(MSBuildThisFileDirectory)/Resources/Others/MyFiles.txt"> <Output TaskParameter="Lines" ItemName="MyItem" /> </ReadLinesFromFile> <ItemGroup> <Lines Include="@(MyItem)"> <Line_test>$([System.String]::Copy('%(MyItem.Identity)'))</Line_test> </Lines> </ItemGroup> <PropertyGroup> <_test>%(Lines.Line_test)</_test> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)' == 'Debug'"> <_TestLine1>$(_test.Split(';')[0])</_TestLine1> <_TestLine2>$(_test.Split(';')[1])</_TestLine2> </PropertyGroup>
解决方案
ReadLinesFromFile任务已经自动按换行拆分每行到项集中,问题在于你直接取%(Lines.Line_test)只会获取最后一行的值,无法遍历所有行生成属性。以下是完整实现:
完整代码
<ReadLinesFromFile Condition="'$(Configuration)' == 'Debug'" File="$(MSBuildThisFileDirectory)/Resources/Others/MyFiles.txt"> <Output TaskParameter="Lines" ItemName="VersionLines" /> </ReadLinesFromFile> <!-- 为每行拆分环境名和版本号,生成元数据 --> <ItemGroup Condition="'$(Configuration)' == 'Debug'"> <VersionLines> <!-- 拆分环境名:截取;前的内容,替换-为空以匹配属性命名 --> <EnvName>$([System.String]::Copy('%(Identity)').Split(';')[0].Replace('-', ''))</EnvName> <!-- 拆分版本号:截取;后的内容 --> <Version>$([System.String]::Copy('%(Identity)').Split(';')[1])</Version> </VersionLines> </ItemGroup> <!-- 遍历项集,动态生成目标属性 --> <CreateProperty Condition="'$(Configuration)' == 'Debug' and '%(VersionLines.Identity)' != ''" Value="%(VersionLines.Version)" PropertyName="_%(VersionLines.EnvName)Version"> <Output TaskParameter="PropertyName" PropertyName="GeneratedPropertyName" /> <Output TaskParameter="Value" PropertyName="$(GeneratedPropertyName)" /> </CreateProperty> <!-- 可选:验证属性生成结果 --> <Message Condition="'$(Configuration)' == 'Debug'" Text="_ProdVersion = $(_ProdVersion)" /> <Message Condition="'$(Configuration)' == 'Debug'" Text="_PreProdVersion = $(_PreProdVersion)" /> <Message Condition="'$(Configuration)' == 'Debug'" Text="_TestVersion = $(_TestVersion)" />
代码说明
- 自动拆分行:
ReadLinesFromFile会将文本按换行拆分为VersionLines项集中的单个项,每个项对应一行内容,无需手动处理换行。 - 生成元数据:为每个项添加
EnvName和Version元数据,其中EnvName会将Pre-Prod转换为PreProd,以匹配目标属性名格式。 - 动态生成属性:通过
CreateProperty任务遍历所有项,用EnvName拼接属性名(_%(EnvName)Version),并赋值为对应的版本号。
内容的提问来源于stack exchange,提问作者8oris
相关产品推荐
相关产品推荐

