2011-10-06 34 views
4

目前我有一个QA服务器可以运行,可以在那里运行svn update来测试每个人都承诺颠覆的代码。 我有越来越多的JavaScript和CSS看到的问题是,分或完整版本,被编译,如:AJAX构建和部署环境特别是javascript和css分,完整版本

  • 构建工具:杰克
  • JS压缩机:UglifyJS
  • CSS优化:CSSO

要么在升级到生产服务器之前手动更新/编译,要么我们的svn只有最小/完整版本,但那不会太好。 我看到一种方法的方式是: *将全部/拆分的css java脚本文件保存在web服务内容所在的路径之外,subversion或trac在提交/触发器上构建最小/完整版本。

有没有人进一步自动化这个过程? 如何分离完整的源代码/完整版本/分钟版本,以免搞乱最终部署?你什么时候编译min版本? 只有在投入生产之前的最后一步? 你在哪里离开原始来源,它不能住在旁边的Web服务其他文件,在我的例子PHP文件?

回答

0

刚才一直在处理类似的事情。如果我正确理解你的问题,你会希望在本地或开发环境中拥有未分类的文件,但在部署时缩小它们。当然,有许多不同的方法可以解决这个问题,目前我们正在研究一个更好的解决方案,但我会给你一个刚刚完成的项目的例子...

使用symfony 1.4,YUI Compressor和git。

我有一个symfony任务(php cli脚本)设置为在给定的css和js文件列表上运行YUI Compressor,这些文件会被转储到适当目录下的min.css和min.js中。该脚本只是将列出的文件的所有内容转储到一个大文件中并缩小它们。然后symfony被设置为只使用min.js.当然,调试缩小的文件可能会很痛苦,所以另一种选择是跳过本地或开发框的缩小,并将它们保存为组合文件。就我个人而言,我已经将它缩小了,因为Chrome的“漂亮打印”选项在大多数时候对我来说足够好,尽管这不是'理想'。

我为git创建了一个本地Post-Commit和服务器端合并后脚本,它只需运行symfony任务,以便在本地提交或在服务器上执行git pull时自动更新这些文件,因此任何更改在提交时更新js/css文件内的内容。唯一的痛点是必须手动运行minify脚本,只要你在本地更新但尚未提交。

在本地/ dev上保留非未定义代码的替代方法需要更多的代码,以便它具有特定的环境,这当然是可行的,但我只是对它懒惰,因为这对于现在来说足够好用了:)

0

我采用了以下基于约定的方法,对于传统网络开发以及移动应用程序和离线HTML5移动应用程序来说,它非常适合我。

约定

  • 所有非精缩/完整版JS/CSS脚本命名为.debug.js或.debug.css扩展。 实施例: global.debug.js和global.debug.css
  • 在HTML参考非调试版本到所有JS/CSS的引用:global.js或global.css中

过程

  • 我使用自定义的MSBuild任务来缩小JS(使用AjaxMin,但你可以使用YUI压缩机或其他人)以下的命名约定* .release.js或* .release.css (例如:global.release .js文件)。
  • 缩小到* .release.js文件后。我还有一个MSBuild任务调用接受当前配置(调试或发布)的简单批处理文件(JS.bat),并将调试(完整源版本)或版本(缩小)版本复制到正常目标。

这里是样品的MSBuild任务,我将添加到我的项目文件,以完成缩小,并调用我的批处理文件:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\MicrosoftAjax\ajaxmin.tasks" /> 
    <Target Name="AfterBuild"> 
    <ItemGroup> 
     <DebugJS Include="**\*.debug.js" /> 
    </ItemGroup> 
    <AjaxMin SourceFiles="@(DebugJS)" SourceExtensionPattern="\.debug.js$" TargetExtension=".release.js" /> 
    <Exec Command="JS.bat $(Configuration)" /> 
    </Target> 

例如,假设:

  • 我在调试模式
  • 和我有一个global.debug.js文件(我工作的完整源代码版本)
  • 当我构建我的项目时,glo bal.debug.js被缩小到global.release.js
  • 由于我处于调试模式配置,global.debug.js将被复制到global.js(这是我的html引用),因此,调试时我将拥有完整源代码版本
  • 如果我切换到发布模式配置,那么global.release.js(缩小版本)将被复制到global.js,这就是我想要的发布/部署到生产。

下面是简单的批处理脚本(JS.bat),我使用基于传递的参数来处理调试的副本或发布脚本:

@Echo off 
REM ---------------------------------------------------------------------------------------- 
REM <summary> 
REM  Script used to copy the Debug (or Release) javascript files to the runtime location 
REM </summary> 
REM <history> 
REM  <change date="9/22/2010" author="Adam Anderly">Created</change> 
REM </history> 
REM ---------------------------------------------------------------------------------------- 
REM Grab the first argument as variable Config (Debug/Release) 
SET Config=%~1 
REM The loop below is used to get the Length of the Config variable 
REM The Length variable is then used in the substring function on Line 22 
for /f "tokens=1 delims=:" %%a in ( 
'^(echo."%Config%"^& [email protected]#^)^|findstr /O /C:"[email protected]#" ' 
) do set /a Length=%%a-5 + 4 
FOR /R %%i IN (*.%Config%.js) DO CALL :REN "%%i" 
GOTO :END 
:REN 
    SET File=%~f1 
    REM Set File2 variable to the runtime filename (minus .debug or .release) 
    CALL SET File2=%%File:~0,-%Length%%%.js 
    REM First make sure the destination file is not read-only 
    IF EXIST "%File2%" ATTRIB /S -R "%File2%" 
    REM Finally, we copy the current debug|release file to the runtime file 
    COPY /Y "%File%" "%File2%" 
:END 

上面的批处理脚本工作递归所以你可以有js或css的嵌套文件夹,它仍然有效。

虽然我使用的是MSBuild,但您当然可以使用不同的构建工具将此批处理文件合并到您的过程中(以前我使用NAnt做过相同的操作)。

希望有帮助!

Adam