3

目前,我让他在MSBuildproj 文件中跟踪代码。这真的很简单。定义 4 个变量并为每个变量调用一次我的 MSBuild 任务:

求代码~~

<ItemGroup><JS_File1 Include="file1.js"/></ItemGroup>
<ItemGroup><JS_File1 Include="file2.js"/></ItemGroup>
<ItemGroup><JS_File1 Include="file3.js"/></ItemGroup>
<ItemGroup><JS_File1 Include="file4.js"/></ItemGroup>

<JavaScriptCompressorTask SourceFiles="@(JS_File1)" OutputFile="@(JS_File1).min"/>
<JavaScriptCompressorTask SourceFiles="@(JS_File2)" OutputFile="@(JS_File2).min"/>
<JavaScriptCompressorTask SourceFiles="@(JS_File3)" OutputFile="@(JS_File3).min"/>
<JavaScriptCompressorTask SourceFiles="@(JS_File4)" OutputFile="@(JS_File4).min"/>

根本没有什么令人兴奋的。

我想知道这是否可以重构为这样的东西。

失败伪代码~~

<ItemGroup>
    <JS_File1 Include="file1.js"/>
    <JS_File1 Include="file2.js"/>
    <JS_File1 Include="file3.js"/>
    <JS_File1 Include="file4.js"/>
</ItemGroup>

<!-- now this is the shiz i have no idea about -->
foreach(@(JS_Files))
    <JavaScriptCompressorTask SourceFiles="@(theFile)" OutputFile="@(theFile).min"/>

在 MSBuild 中可以做到这一点吗?

因此,该任务被称为“每个文件一次”.. 还是更重要的是,“项目组中的每个项目一次”?

4

2 回答 2

4

您可以使用项目元数据来批处理任务(请参阅http://msdn.microsoft.com/en-us/library/ms171474.aspx)。

所有项目都有称为“身份”的元数据,其中包含包含属性的值。如果您使用元数据引用语法%(Identity),这将指示 MSBuild 为每个唯一的 Include 值执行您的任务。

<ItemGroup>
    <JS_File1 Include="file1.js"/>
    <JS_File1 Include="file2.js"/>
    <JS_File1 Include="file3.js"/>
    <JS_File1 Include="file4.js"/>
</ItemGroup>

<JavaScriptCompressorTask SourceFiles="@(JS_File1)" OutputFile="%(Identity).min"/>

请注意,MSBuild 知道您正在引用JS_File1项组的 Identity 元数据,因为您在任务中引用了它。否则,您将需要使用语法%(JS_File1.Identity)

于 2012-10-19T19:55:47.640 回答
0

像这样,除了使用你的任务而不是我的副本......

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Minifier" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="Minifier">
    <ItemGroup>
      <JS_File1 Include="file1.js"/>
      <JS_File1 Include="file2.js"/>
      <JS_File1 Include="file3.js"/>
      <JS_File1 Include="file4.js"/>
    </ItemGroup>

    <Copy SourceFiles="@(JS_File1)" DestinationFiles="@(JS_File1->'%(Filename).min')"/>

  </Target>
</Project>

希望那有帮助。

于 2012-10-18T15:41:08.977 回答