evi*_*mer 13 deployment msbuild msbuild-task msbuildcommunitytasks
当我在MSBUILD中的文件上执行ReadLinesFromFile并再次输出该文件时,我将所有文本放在一行上.所有Carriage返回和LineFeeds都被删除.
<Project DefaultTargets = "Deploy"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<ItemGroup>
<MyTextFile Include="$(ReleaseNotesDir)$(NewBuildNumber).txt"/>
</ItemGroup>
<Target Name="ReadReleaseNotes">
<ReadLinesFromFile
File="@(MyTextFile)" >
<Output
TaskParameter="Lines"
ItemName="ReleaseNoteItems"/>
</ReadLinesFromFile>
</Target>
<Target Name="MailUsers" DependsOnTargets="ReadReleaseNotes" >
<Mail SmtpServer="$(MailServer)"
To="$(MyEMail)"
From="$(MyEMail)"
Subject="Test Mail Task"
Body="@(ReleaseNoteItems)" />
</Target>
<Target Name="Deploy">
<CallTarget Targets="MailUsers" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
我从文件中得到通常看起来像这样的文本
Run Code Online (Sandbox Code Playgroud)- New Deployment Tool for BLAH - Random other stuff()""
像这样出来
Run Code Online (Sandbox Code Playgroud)- New Deployment Tool for BLAH;- Random other stuff()""
我知道ReadLinesFromFile的代码将一次拉取一行数据并去除回车.
有没有办法把它们放回去?所以我的电子邮件看起来格式很好?
谢谢
Tod*_*odd 41
这里的问题是你ReadLinesFromFile以一种不打算的方式使用任务.
ReadLinesFromFile任务从文本文件中
读取项目列表.
因此,它不只是从文件中读取所有文本,而是从文件中读取单个项目并返回ITaskItems的项目组.每当使用@()语法输出项目列表时,您将获得一个单独的列表,默认值为分号.此示例说明了此行为:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<ItemGroup>
<Color Include="Red" />
<Color Include="Blue" />
<Color Include="Green" />
</ItemGroup>
<Target Name="Build">
<Message Text="ItemGroup Color: @(Color)" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
ItemGroup Color: Red;Blue;Green
Run Code Online (Sandbox Code Playgroud)
因此,尽管您的问题的最佳解决方案是编写一个MSBuild任务,将文件作为字符串读入属性而不是项目列表,这实际上不是您要求的.你问是否有办法将它们放回去,并且使用了MSBuild Transforms.
转换用于从另一个列表创建一个列表,并且还可以使用自定义分隔符进行转换.所以答案是将使用的ReadItemsFromFile列表转换为另一个带换行符的列表.这是一个例子:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<ItemGroup>
<File Include="$(MSBuildProjectDirectory)\Test.txt" />
</ItemGroup>
<Target Name="Build">
<ReadLinesFromFile File="@(File)">
<Output TaskParameter="Lines" ItemName="FileContents" />
</ReadLinesFromFile>
<Message Text="FileContents: @(FileContents)" />
<Message Text="FileContents Transformed: @(FileContents->'%(Identity)', '%0a%0d')" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
Test.text看起来像:
Red
Green
Blue
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
[C:\temp]:: msbuild test.proj
Microsoft (R) Build Engine Version 3.5.21022.8
[Microsoft .NET Framework, Version 2.0.50727.1433]
Copyright (C) Microsoft Corporation 2007. All rights reserved.
Build started 11/8/2008 8:16:59 AM.
Project "C:\temp\test.proj" on node 0 (default targets).
FileContents: Red;Green;Blue
FileContents Transformed: Red
Green
Blue
Done Building Project "C:\temp\test.proj" (default targets).
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:00.03
Run Code Online (Sandbox Code Playgroud)
这里发生了两件事.
@(FileContents->'%(Identity)', '%0a%0d')
Run Code Online (Sandbox Code Playgroud)
Identity)但是使用自定义分隔符将列表从一种类型转换为另一种类型'%0a%0d'%0a)和回车符(%0d)use*_*810 36
如果您使用的是MSBuild 4.0,则可以执行以下操作来获取文件的内容:
$([System.IO.File]::ReadAllText($FilePath))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21221 次 |
| 最近记录: |