问题 如何连接MSBuild中的文件并保留选项卡和空格


我正在尝试在构建过程中连接几个文件,但我尝试的方式剥离了标签和空格,使输出无格式化。

<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" />

保留格式的方法是什么?


7253
2018-04-07 03:57


起源

这个问题可以帮助/解释: stackoverflow.com/questions/272518/... - Kevin Richardson


答案:


这是我在遇到同样问题时最终得到的结果:

<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 任务,如建议 这个答案


11
2018-04-10 09:14



在VS2013中,它不起作用。 - Leo Y
我正在使用VS2013社区,它适用于我。 - Anders Fjeldstad
VS2013 Premium V12.0..31101.00更新4.当文件具有标题选项卡或空格时,连接结果不会。所有行都从左边缘开始,带有文本。我使用的是除<ConcatFiles>或<FileContents>之外的其他元素,但并不重要。顺便说一句,如果我将构建输出设置为“诊断”VS打印在目标中调用ReadLinesFromFile。 - Leo Y
这非常有效。我正在2015年更新2.唯一困难的部分是找到这篇文章! :) - paqogomez
谢谢! PS如果你想在连接文件之间放置一些“空白区域”,你可以添加一些额外的东西。示例:<FileContents Include =“$([System.IO.File] :: ReadAllText(%(InFiles.Identity)))%0a%0a%0aWHITESPACE%0a%0a%0a”/>其中%0a是回车符。 - granadaCoder