使用 YUI compressor .NET 压缩子文件夹中的所有 JS 文件

Compress all JS files in subfolders using YUI compressor .NET

在我的 "Scripts" 文件夹内的项目中,我有很多子目录。我想缩小每个 js 文件,并将输出命名为 "respective-subdirectory/file_name.min.js"。为此,我在 BundleConfig.xml 文件中使用了以下代码:

<Target Name="Minify"> 
   <CreateItem Include="$(MSBuildProjectDirectory)\Scripts\*\*.js;">
      <Output TaskParameter="Include" ItemName="JsFiles"/>
   </CreateItem>

   <JavaScriptCompressorTask
    SourceFiles="@(JsFiles)"
    DeleteSourceFiles="false"
    OutputFile="$(MSBuildProjectDirectory)\Scripts\*\%(JsFiles.Filename).min.js"
    CompressionType="Standard"
    LoggingType="Info"
    LineBreakPosition="-1"
   />
</Target>

当我在我的 OutputFile 标签中放置“*\”时,出现构建错误。那么有人可以指导我如何实现这一点(每个缩小的文件应该只放在各自的子目录中)

首先要单独压缩每个文件(而不是合并它们),您需要在 SourceFiles 中使用 % 而不是 @ 来批处理 JavascriptCompresor 任务。

其次,您可以在包含路径中使用 ** 并在 JavascriptCompressor 任务中使用 %(RecursiveDir) 替换它。

我目前无法测试,但我认为类似以下内容应该可行:

<Target Name="Minify"> 
   <CreateItem Include="$(MSBuildProjectDirectory)\Scripts\**\*.js;">
      <Output TaskParameter="Include" ItemName="JsFiles"/>
   </CreateItem>

   <JavaScriptCompressorTask
    SourceFiles="@(JsFiles)"
    DeleteSourceFiles="false"
    OutputFile="$(MSBuildProjectDirectory)\Scripts\%(JsFiles.RecursiveDir)\%(JsFiles.Filename).min.js"
    CompressionType="Standard"
    LoggingType="Info"
    LineBreakPosition="-1"
   />
</Target>

关于 RecursiveDir 的更多信息,您可以阅读这篇文章:https://msdn.microsoft.com/en-us/library/ms164313.aspx