【问题标题】:TFS Build 2010 - Minify JS/CSS before deploymentTFS Build 2010 - 部署前缩小 JS/CSS
【发布时间】:2011-11-21 04:58:04
【问题描述】:

我已经掌握了 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

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

【问题讨论】:

    标签: visual-studio-2010 tfs tfsbuild microsoft-web-deploy


    【解决方案1】:

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

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

    所以,你问,我决定的解决方案是编写一个 PowerShell 脚本(我从 here 得到它的开头 - 然后我稍微修改它以获取命令行参数 - 这将是根文件夹你的项目。脚本递归地遍历每个文件(和每个子目录的文件)并缩小里面的 .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 中,我们需要做的就是向 execute the PowerShell script in TFS 添加一个 InvokeProcess 步骤。您可以使用 InvokeProcess 活动的 Arguments 属性将参数传入(开始缩小的目录)。

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

    P.S - SourcesDirectory 非常高 - 你可能不想从那里一直钻到你的 .js 和 .css 文件,所以你需要指定类似的东西:

    SourcesDirectory + "/" + "MyProjectFolder/Scripts"
    

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

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

    【讨论】:

      【解决方案2】:

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

      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 活动 :-)

      请告诉我这对你有什么影响。

      【讨论】:

      • 我很想分享...但我这样做是为了工作。但我也会为你们(以及 TFS 社区扩展)“重写”它。它的最佳位置是什么?吉特? PasteBin?
      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

      • 谢谢 - 这为我指明了正确的方向。另一个快速的问题 - 我如何真正获得我想要缩小的 .js 和 .css 文件的路径,因为它们直接来自版本控制并且位于构建代理上的某种临时工作区中是正确的吗?
      • 在工具箱中查看“团队基础构建活动”。在那里您可以找到“ConvertWorkspaceItem”和“ConvertWorkspaceItems”,它们接受文件的源代码控制标记($/...)作为输入,并返回文件的当前实际路径
      • 不要调用...那不是托管的。您在原始帖子中链接的那个问题是我的。通过电子邮件与我联系。我会告诉你我是怎么做到的
      • @IssaFram:与我们其他人分享您的解决方案不是更好吗?我会很感兴趣的!
      • 我很想分享...但我这样做是为了工作。但我也会为你们(以及 TFS 社区扩展)“重写”它。它的最佳位置是什么?吉特? PasteBin?
      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      相关资源
      最近更新 更多