1

我已经掌握了 Ajax 缩小器,以便在构建/打包/部署过程中缩小一些 JS 和 CSS 文件。这是一个很棒的工具,可以满足我们的需要。然而,将其集成到我们的构建/部署过程中是非常困难的。

理想情况下,我们希望在执行 TFS 2010 构建(即不是开发机器上的本地 (Ctrl+Shift+B jobbie) 构建)时运行此工具。此外,我们希望在这种情况下用缩小的文件(即在相同的文件名下)替换我们当前的“非缩小”文件,而不是加载名为“.min.js”等的附加文件。

经过大量阅读后,我认为关键是在工作流程中执行自定义构建任务——但我不知道如何解决这个问题——尤其是当我希望缩小将直接从我们的版本中拉下的文件时作为 TFS 2010 构建的一部分,在 TFS 中分支(即不在某人的本地工作区中)。

这是我发现的最接近我想要实现的讨论:Microsoft Ajax Minifier - TFS 2010 Workflow - AjaxMin in the TFS Build

我相信我需要在构建工作流程中自定义代码活动,但不知道如何创建一个来解决这个问题。任何人都可以阐明在部署之前允许缩小的过程吗?

4

3 回答 3

6

好的 - 多亏了这些答案和大量研究......我找到了以下解决方案:)

从自定义代码活动开始,我尝试从 C# 代码运行压缩程序,然后将活动作为工作流的一部分调用。这不起作用,因为压缩程序的 .dll 版本公开了几种用于压缩 .js 和 .css 文件的方法,然后让您打开某种 StreamWriter 并使用从返回的压缩字符串重新编写文件方法(如果您想覆盖现有文件)。整天打开和关闭文件非常密集,所以我对这个解决方案并不满意。使用进程类运行带有 -clobber 选项(用于覆盖文件)的 .exe 也不是很理想,并且会产生一些奇怪的结果(不能正确地缩小文件并在每个文件的开头写入一些垃圾)。

所以,你问,我决定的解决方案是编写一个 PowerShell 脚本(我从这里得到它的开头- 然后我稍微修改它以采用命令行参数 - 这将是你项目的根文件夹。脚本递归地遍历每个文件(和每个子目录的文件)并缩小里面的 .css 和 .js 。非常整洁。它的骨骼看起来像这样:

$ScriptDirectory = $args[0]
Write-Host "Validating directory parameter: $ScriptDirectory"
Write-Host ""

if ((Test-Path -path $ScriptDirectory) -ne $True)
{
     #Throw an error of some kind (the parameter passed in isn't a valid directory).
}

$Minifier = “C:\Program Files\Microsoft\Microsoft Ajax Minifier 4\AjaxMin.exe”

get-childitem $ScriptDirectory -recurse -force -include *.js, *.css -exclude *.min.js, *.min.css | foreach-object {&$Minifier $_.FullName -out $_.FullName -clobber}

因此,我们遍历根文件夹的每个子项目,扩展名为 .js 或 .css(忽略 .min.* 的扩展,因为它们已经被压缩)。

在 TFS 中,我们需要做的就是在 TFS 中添加一个执行 PowerShell 脚本InvokeProcess的步骤。您可以使用 InvokeProcess 活动的 Arguments 属性将参数传入(开始缩小的目录)。

要获取 TFS 构建在发布之前用于编译代码的目录(临时工作区,如果您愿意),您可以使用构建的 Run On Agent 序列中可用的 SourcesDirectory 变量。这是您的文件由 TFS 构建过程编译和打包的位置,因此在此处缩小的任何内容都将最终出现在最终部署包中。

PS - SourcesDirectory 相当高 - 你可能不想从那里一直钻到你的 .js 和 .css 文件,所以你需要指定如下内容:

SourcesDirectory + "/" + "MyProjectFolder/Scripts"

确保在将代码部署到工作流和 hey-presto 之前添加此 InvokeProcess 步骤 - 您将拥有缩小的 .js 和 .css 文件,它们仅将原始文件名保留为 TFS 构建的一部分,而不是本地文件.

非常感谢所有回答并指出我正确方向的人。我希望这对一路上的人有所帮助!

于 2011-09-22T13:33:09.203 回答
1

将此作为自定义代码活动当然是可行的,但您必须付出一些努力。我的建议是:

  1. 首先关注 Ewald Hofman 的 TFS 2010 定制博客,网址为http://www.ewaldhofman.nl/post/2010/04/29/Customize-Team-Build-2010-e28093-Part-4-Create-your-own-activity .aspx以了解有关创建自定义活动的信息
  2. 然后看看http://www.ewaldhofman.nl/post/2010/06/01/Customize-Team-Build-2010-e28093-Part-10-Include-Version-Number-in-the-Build-Number同一系列的.aspx实现了一种机制来查找所有符合特定模式的文件。在该示例中,assemblyInfo.cs 文件被编入索引并且它们的内容发生了变化。通过搜索您的 *.js 文件来替换它。
  3. 在您的文件选择上释放 Ajax Minifier 的力量,并用缩小的文件替换原始文件。
  4. 构建活动,将其作为您在 TFS 2010 中使用的构建过程模板中的一个步骤(也在相同的博客文章中进行了描述),并将其微调到您满意的程度。

或者,您可以要求您问题中包含的帖子的作者与我们分享他创建的 Minifier TFS 活动 :-)

请让我知道这对你有什么影响。

于 2011-09-20T19:10:08.947 回答
1

您需要实现一个Invoke Process Activity以便在 TFS 构建期间执行 Minifier。

为此,您还必须在进行构建的服务器中安装压缩程序,即所谓的 Build-Agent(s)。通过这样做,您将确保仅在 TFS 构建期间调用 Minifier(与本地 VS 构建相反)。

为了重命名生成的输出文件 (*.min.js),您需要为此实现另一个自定义活动。覆盖您的签入文件需要您首先使它们可写,这意味着另一个自定义活动(我在另一个答案中提供了一个片段)。

整个编排是
Invoke Minifier 与 InvokeProcess -->使签入的文件可写->用重命名的缩小文件覆盖签入的文件

在 TFS 构建中执行此操作的正确方法是将它们包装在Sequence.

可以在此处找到一篇关于如何实现调用流程的介绍性博客文章。
我还发现 E.Hofman 的系列具有真正的价值。

于 2011-09-20T19:14:27.167 回答