如何将ItemGroup的Excludes拆分为多行?

时间:2016-07-05 16:52:03

标签: msbuild

我有一个自定义的MSBuild任务来缩小一些JavaScript文件。我创建了一个ItemGroup来定义我想要缩小哪些文件,哪些文件不应该缩小。我在.csproj文件中有以下内容:

<ItemGroup>
  <JS Include="**\*.js" Exclude="**\*.min.js;obj\**\*.*;**\_references.js;[snip]" />
</ItemGroup>

我想将该属性拆分为几行以提高可读性(剪切部分很长,以后可能会更长),所以我尝试了这个:

<ItemGroup>
  <JS Include="**\*.js" Exclude="**\*.min.js" />
  <JS Exclude="obj\**\*.*" />
  <JS Exclude="**\_references.js" />
  [snip]
</ItemGroup>

但是这给了我这个构建错误:

error MSB4066: The attribute "Exclude" in element <JS> is unrecognized.

当我在后续元素中添加空包含(Include="")时发生了同样的情况。 (在引号中放入一些内容会删除错误,但在JS var中包含了额外的“文件”。)

然后我从the docs for MSBuild Items了解到,Exclude属性仅影响同一元素中Include属性添加的项目。

我也尝试过只使用一个Exclude字符串,但将字符串本身分成多行,如下所示:

<ItemGroup>
  <JS Include="**\*.js"
      Exclude="**\*.min.js;
               obj\**\*.*;
               **\_references.js;
               [snip]" />
</ItemGroup>

看起来没问题,但是当我随后从Visual Studio中保存项目时,行结尾被破坏了,所以它变成了这个:

<ItemGroup>
  <JS Include="**\*.js" Exclude="**\*.min.js;&#xD;&#xA;                   obj\**\*.*;&#xD;&#xA;                   **\_references.js;&#xD;&#xA;                   [snip]" />
</ItemGroup>

(这不会破坏构建中的任何内容,但会破坏将字符串拆分为多行的目的。)

如何将这些排除分成多行?

1 个答案:

答案 0 :(得分:4)

我找到了this answer about excluding files from Content,它也是ItemGroup的一部分。所以我试过了:

<ItemGroup>
  <JS Include="**\*.js" Exclude="**\*.min.js" />
  <JS Remove="obj\**\*.*" />
  <JS Remove="**\_references.js" />
  [snip]
</ItemGroup>

那很有用。 JS现在只包含我想要的文件,csproj文件更具可读性。