如何在MSBuild任务中向文件插入行?

4

我正在尝试将一些文本插入到文本的第二行。目前,我使用ReadLinesFromFile将文本插入到了顶部。有没有办法将我从中获取的列表分成两个部分,以便我可以在第二行插入文本?

现在的情况:

<Target>
  <ReadLinesFromFile File="targetfile.txt">
    <Output TaskParameter="Lines" ItemName="TargetFileContents"/>
  </ReadLinesFromFile>

  <WriteLinesToFile File="targetfile.txt" Lines="$(TextToInsert)" Overwrite="true"/>
  <WriteLinesToFile File="targetfile.txt" Lines="@(TargetFileContents)" Overwrite="false"/>
</Target>  
1个回答

5

虽然带着全部脚手架可能有点太过,但你可以将任务写入项目文件(或者被包含的文件,通常会使用 .targets 扩展名):

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTarget="InsertLine">   
    <Target Name="InsertLine">
        <InsertIntoFile FilePath="test.txt" LineNumber="999" Text="Test complete" />
        <InsertIntoFile FilePath="test.txt" LineNumber="1" Text="2" />
        <InsertIntoFile FilePath="test.txt" LineNumber="2" Text="3" />
        <InsertIntoFile FilePath="test.txt" LineNumber="1" Text="1" />
        <InsertIntoFile FilePath="test.txt" LineNumber="1" Text="Testing the 2MC" />
    </Target>
    <UsingTask
      TaskName="InsertIntoFile"
      TaskFactory="CodeTaskFactory"
      AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
        <ParameterGroup>
            <FilePath ParameterType="System.String" Required="true" />
            <LineNumber ParameterType="System.Int32"  Required="true" />
            <Text ParameterType="System.String" Required="true" />
        </ParameterGroup>
        <Task>
          <Using Namespace="System" />
          <Using Namespace="System.IO" />
          <Code Type="Fragment" Language="cs">
              <![CDATA[
                // By tradition, text file line numbering is 1-based
                var lines = File.Exists(FilePath) 
                                      ? File.ReadAllLines(FilePath).ToList() 
                                      : new List<String>(1);
                lines.Insert(Math.Min(LineNumber - 1, lines.Count), Text);
                File.WriteAllLines(FilePath, lines);
                return true;
              ]]>
            </Code>
        </Task>
    </UsingTask>
</Project>  

谢谢!我不知道你可以像这样基本上内联创建自定义任务。 - Matt Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接