使用MSBuild进行脚本压缩和持续集成

18
在我最近的一个C#/ASP.NET项目中,我有一些相当复杂的JavaScript文件和一些漂亮的样式表。随着这些脚本资源的增长,建议压缩资源并尽可能保持网页轻盈。我知道许多开发人员在调试后手动将他们的JavaScript资源放入压缩器中,然后部署他们的应用程序。
当涉及到源代码控制和连续集成的自动化构建时(感谢CruiseControl.NET),手工压缩就不再适用了。保持JS/CSS源文件和它们被压缩后的兄弟姐妹分别存储在一个独立的目录结构中是维护源代码控制并提供压缩资源的唯一方法。然后只在代码后台注册其中一个资源集。但是,如果开发人员更改JS/CSS源文件,然后未能重新压缩并检入两个版本,则您的代码行现在已经失步了。更不用说不优雅了。

我认为编写一个自定义可执行文件(如果还不存在的话)来处理CC.NET任务块会很好,该文件会在构建操作之后但在asp.net发布到目标之前,在目标目录中查找和压缩所有JavaScript和CSS资源。这样,开发人员只需处理JS和CSS源代码,用户只会得到已压缩的资源。

是否有已经执行此任务的应用程序?如果没有,我应该安装哪些资源才能让CC.NET执行此操作?

(我在这里找到的最接近的问题需要使用NAnt,但在我的情况下不是选项。)

编辑: Dave Ward现在在他的网站上有一篇关于如何在Visual Studio中自动压缩的绝佳文章。


我认为您所说的minify是指最小化... - Mitch Wheat
3
不,我的意思是压缩(http://en.wikipedia.org/wiki/Minify),但我认为这两个术语可以互换使用。我相信这两个术语是可替换的。 - Ian Patrick Hughes
3个回答

24
MSBuildCommunityTasks项目提供了一些MSBuild任务,包括Merge和JSCompress,这些任务可能可以满足您的需求。 您可以将它们添加到AfterBuild目标中,以便在每次构建项目时执行此操作,这样就不会有任何数据不同步的情况发生。您的Web应用程序可以引用紧凑版本来运行,而开发人员则可编辑完整版本。 除了需要MSBuild社区任务程序集之外,服务器上不需要其他任何内容。您可以将此程序集放在自己的源树中,并从那里进行引用,CI构建应在构建时获取该程序集及其所需的所有内容。

2
哇,太神奇了,今晚我要把这个问题放到 StackOverflow 上,结果谷歌搜索出现了我们的网站!太棒了,SO!Todd 的回答也很好,点赞 +1。 - Jarrod Dixon
我必须补充一下,msbuild任务社区项目非常出色。我在我们的构建过程中使用jscompress。请注意,在压缩过程中不要包含jquery.min文件,因为它会导致错误。 - BozoJoe
FYI:MSBuildTasks项目已经迁移到GitHub:https://github.com/loresoft/msbuildtasks - Steve J

4

不错的发现,Jarrod。我将会寻找一个自动化的CSS压缩器来加入到自动构建中。这是个好发现。 - Ian Patrick Hughes
Jarrod,你们能否再看一下YUICompressor的.NET端口(上面的链接)?昨天发布了一个新版本。上次你们在SO播客中说有问题。很想知道这个版本是否适用于你们的部署计划...如果不行,请说明原因/具体情况等 :) - Pure.Krome

1
如果您正在使用MVC4,则可以将此作为新功能内置。在运行Debug配置时,它会输出带有注释等的单个文件,但当您切换到Release时,它将自动捆绑,缩小并更改页面引用以使其指向已缩小的文件。您可以为jQuery和自己的JS设置单独的包。这适用于CSS和JS文件。

http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification

如果MVC4对您无效,您还可以在Nuget上找到一些可以帮助的包,例如这个:

https://www.nuget.org/packages?q=minify


是的,现在比2008年发布这个问题时有更多的选择。 - Ian Patrick Hughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接