【问题标题】:How can I insert lines into a file in an MSBuild Task?如何在 MSBuild 任务中将行插入文件?
【发布时间】:2014-02-01 23:38:34
【问题描述】:

我正在尝试将一些文本插入到文本第二行的文件中。我目前使用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>  

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    所有的脚手架有点像大锤,但你可以将任务写入项目文件(或包含的文件,通常具有 .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>  
    

    【讨论】:

    • 谢谢!我不知道你可以像这样创建一个基本上内联的自定义任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多