我正在使用Microsoft Ajax Minifier来缩小我的javascript文件。在清单中,我想指定源文件夹中的所有js文件应缩小为不同的输出文件夹。原始文件名应该用作输出文件名,并且应该附加一个变量。我想做一些像下面的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和Configuration设置的示例。
<!-- 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>
这可能吗?
答案 0 :(得分:1)
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逻辑列出源/目标文件,然后使用executable单独缩小它们。可能会慢一些,只需添加它就可以完成:
<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>
答案 1 :(得分:0)
到目前为止,似乎无法在清单文件中使用通配符和变量,但我能够通过使用@stijn建议的第二种方法来实现我的总体目标。这是我做的:
<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>
<Import Project="$(MSBuildProjectDirectory)\Build\AjaxMin.targets" />
提示:在重新打开解决方案之前,似乎无法识别对AjaxMin.targets文件的更改。我浪费了整整一天的时间去挖洞,直到我弄明白了。
AjaxMin.targets文件的AjaxMinManifestTask部分根据清单启动了一些js和css文件的缩小和合并。清单XML的格式记录在Microsoft Ajax Minifier website。
AjaxMin.targets文件的Processing Pages部分启动Scripts \ PageSource文件夹中每个文件的缩小,并将结果输出到Scripts \ Pages文件夹。它还会将VerNumber值附加到生成的文件名中。