好的 - 多亏了这些答案和大量研究......我找到了以下解决方案:)
从自定义代码活动开始,我尝试从 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 构建的一部分,而不是本地文件.
非常感谢所有回答并指出我正确方向的人。我希望这对一路上的人有所帮助!