如何在MSBuild中连接文件并保留制表符和空格

12

我正在尝试在构建过程中连接几个文件,但我尝试的方法会剥离制表符和空格,导致输出不被格式化。

<CreateItem Include="Scripts\ApplicationModule.d.ts; Scripts\AccountModule.d.ts; Scripts\FeedModule.d.ts;">
  <Output TaskParameter="Include" ItemName="ApplicationDefinitionFiles" />
</CreateItem>

<ReadLinesFromFile File="%(ApplicationDefinitionFiles.FullPath)">
  <Output TaskParameter="Lines" ItemName="ApplicationDefinitionLines" />
</ReadLinesFromFile>

<WriteLinesToFile File="Scripts\ApplicationDefinition.d.ts" Lines="@(ApplicationDefinitionLines)" Overwrite="true" />

如何保留格式?


2
这个问题可能会有所帮助/解释:https://dev59.com/jHVC5IYBdhLWcg3whBWj - Kevin Richardson
1个回答

13

当我面对相同的问题时,这就是我最终得到的结果:

<Target Name="ConcatenateScripts">
  <!-- List all the files you want to concatenate. -->
  <ItemGroup>
    <ConcatFiles Include="
        Scripts\ApplicationModule.d.ts; 
        Scripts\AccountModule.d.ts;
        Scripts\FeedModule.d.ts;"/>
  </ItemGroup>

  <!-- Read the contents of the files (preserving tabs/spaces). -->
  <ItemGroup>
    <FileContents Include="$([System.IO.File]::ReadAllText(%(ConcatFiles.Identity)))"/>
  </ItemGroup>

  <!-- Write the result to a single file. -->
  <WriteLinesToFile File="Scripts\ApplicationDefinition.d.ts" Lines="@(FileContents)" Overwrite="true" />
</Target>

<!-- Concatenate scripts on AfterBuild. -->
<Target Name="AfterBuild">
  <CallTarget Targets="ConcatenateScripts"/>
</Target>

这是此博客文章的修改版,但使用建议在此答案中提到的$([System.IO.File]::ReadAllText(...)代替ReadLinesFromFile任务。


VS2013 Premium V12.0..31101.00 更新4。 当文件具有标题选项卡或空格时,连接的结果不包含它们。所有行都从左侧边缘开始显示文本。我正在使用除<ConcatFiles>或<FileContents>之外的其他元素,但这并不重要。顺便说一下,如果我将生成输出设置为“诊断”,VS会打印出ReadLinesFromFile在目标内被调用的信息。 - Leo Y
这个完美地解决了问题。我使用的是2015更新2版本。唯一困难的部分是找到这篇文章! :) - crthompson
谢谢!PS 如果你想在连接的文件之间添加一些“空白”,你可以加入一些额外的东西。例如:<FileContents Include="$([System.IO.File]::ReadAllText(%(InFiles.Identity)))%0a%0a%0aWHITESPACE%0a%0a%0a"/> 其中 %0a 是回车符。 - granadaCoder

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