可以在 Microsoft Ajax Minifier 清单文件中使用通配符和变量吗?

Can wildcards and variables be used in a Microsoft Ajax Minifier manifest file?

我正在使用下面的 Microsoft Ajax Minifier to minify my javascript files. In the manifest, I would like to specify that all js files in a source folder should be minified into a different output folder. The original filename should be used as the output filename plus a variable should be appended. I would like to do something like the manifest,其中输出使用 * 通配符并且变量是版本号 4.60。

<?xml version="1.0" encoding="utf-8"?>
$(version) = "-4.60"
<root>
    <output path="..\Scripts\Pages\*$(version)" type="js">
        <input path="Scripts\PageSource\" type="js" />
    </output>
</root>

在输出设置中使用 * 会引发构建错误,但可能存在不同的通配符?输出和输入设置有很多,这就是为什么我想指定一次版本号并重复使用它。

targets file(见下文)中的任何设置是否可以用于此目的?我找不到任何示例来说明 ProjectDefaultSwitches 和配置设置的作用。

<!-- target to build all ajaxmin manifest files in the project -->
<Target Name="BuildAjaxMinManifests" AfterTargets="Build">
    <Message Text="Processing AjaxMin Manifests" Importance="high" />
    <CreateItem Include="@(None)" Condition="'%(Extension)'=='.ajaxmin'">
        <Output TaskParameter="Include" ItemName="AjaxMinManifests"/>
    </CreateItem>

    <AjaxMinManifestTask ProjectDefaultSwitches="-define:$(DefineConstants))"
                         Configuration="$(Configuration)"
                         TreatWarningsAsErrors="false"
                         InputFolder="$(ProjectDir)"
                         OutputFolder="$(ProjectDir)Content\"
                         Manifests="@(AjaxMinManifests)" />
</Target>

这可能吗?

AjaxMinTask 的文档提供了一些示例,这些示例完全符合您的要求:列出输入文件并根据它缩小为新文件名。像这样:

<!-- This should point to the dll, or check docs and alternatively use 'Import'-->
<UsingTask TaskName="AjaxMin" AssemblyFile="$(MSBuildProjectDirectory)\AjaxMinTask.dll" />

<Target Name="Minify" AfterTargets="Build">
  <PropertyGroup>
    <!-- Version number to append should be defined somewhere -->
    <MinVersion>4.60</MinVersion>
  </PropertyGroup>
  <ItemGroup>
    <!-- List the input files, assume relative to project file -->
    <ToMinify Include="$(MSBuildProjectDirectory)\Scripts\PageSource\*.js"/>
  </ItemGroup>
  <!-- Minify -->
  <AjaxMin JsSourceFiles="@(ToMinify)" JsSourceExtensionPattern="\.js$" JsTargetExtension="..\Page$(MinVersion).js"/>
</Target>

将此粘贴到项目文件末尾附近的某个位置,AfterTargets="Build" 部分将在构建后自动使此目标 运行。

AjaxMinManifestTask 也可以使用,但它似乎没有更改文件名的选项。您仍然可以使用它并在它之后重命名所有文件以包含版本号,但这只是额外的工作。另一种选择是使用 msbuild 逻辑列出 source/destination 文件,然后使用可执行文件单独缩小它们。可能会更慢,只是为了完整性添加这个:

<Target Name="Minify" AfterTargets="Build">
  <PropertyGroup>
    <MinVersion>4.60</MinVersion>
  </PropertyGroup>
  <ItemGroup>
    <ToMinify Include="$(MSBuildProjectDirectory)\Scripts\PageSource\*.js"/>
  </ItemGroup>
  <Exec Command="ajaxmin.exe %(ToMinify.Identity) -out $(MSBuildProjectDirectory)\Script\Pages\%(ToMinify.FileName)$(MinVersion).jsmin -clobber" />
</Target>

到目前为止,似乎无法在清单文件中使用通配符和变量,但我能够通过使用@stijn 建议的第二种方法来实现我的总体目标。这是我所做的:

  1. 已下载并安装 Microsoft Ajax Minifier
  2. 找到安装文件夹并将AjaxMin.dll、AjaxMin.exe、AjaxMinifier.exe和AjaxMinTask.dll文件复制到项目的Build文件夹中。如果有多个开发人员,则此文件夹应受源代码管理。
  3. 在项目的 Build 文件夹中创建了一个名为 AjaxMin.targets 的文件。文件内容为:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <UsingTask TaskName="AjaxMinManifestTask" AssemblyFile="$(ProjectDir)Build\AjaxMinTask.dll" /> <Target Name="BuildAjaxMinManifests" AfterTargets="Build"> <Message Text="Processing Manifest" Importance="high" /> <CreateItem Include="@(None)" Condition="'%(Extension)'=='.ajaxmin'"> <Output TaskParameter="Include" ItemName="AjaxMinManifests"/> </CreateItem> <AjaxMinManifestTask ProjectDefaultSwitches="-define:$(DefineConstants)" Configuration="$(Configuration)" TreatWarningsAsErrors="false" InputFolder="$(ProjectDir)" OutputFolder="$(ProjectDir)" Manifests="@(AjaxMinManifests)" /> <Message Text="Processing Pages" Importance="high" /> <PropertyGroup> <VerNumber>4-62-0-0</VerNumber> </PropertyGroup> <ItemGroup> <ToMinify Include="$(ProjectDir)Scripts\PageSource\*.js"/> </ItemGroup> <Exec Command="$(ProjectDir)Build\AjaxMin.exe %(ToMinify.Identity) -out $(ProjectDir)Scripts\Pages\%(ToMinify.FileName)-$(VerNumber).js -clobber" /> </Target> </Project>

  1. 卸载然后编辑项目以在底部添加以下内容:

<Import Project="$(MSBuildProjectDirectory)\Build\AjaxMin.targets" />

  1. 确保 Scripts\PageSource 文件和 Scripts\Pages 文件夹存在。
  2. 关闭并重新打开解决方案。
  3. 重建解决方案。

提示:在重新打开解决方案之前,似乎无法识别对 AjaxMin.targets 文件所做的更改。我花了一整天的时间钻进兔子洞,直到我弄明白了。

AjaxMin.targets 文件的 AjaxMinManifestTask 部分根据清单开始缩小和合并多个 js 和 css 文件。清单 XML 的格式记录在 Microsoft Ajax Minifier website.

AjaxMin.targets 文件的处理页面部分开始对 Scripts\PageSource 文件夹中的每个文件进行缩小,并将结果输出到 Scripts\Pages 文件夹。它还将 VerNumber 值附加到生成的文件名中。