使用JSBuilder或Apache ANT构建Sencha Touch应用程序

时间:2011-08-05 19:57:06

标签: javascript ant sencha-touch jsbuilder

假设您已经使用一堆视图,控制器,模型,商店,实用程序等构建(编码)您的MVC Sencha Touch应用程序......

什么是构建生产应用程序的最佳方法?

任务将是:

  • Concat并缩小所有JS源文件
  • Concat并缩小Stylesheets(基本上运行Compass与生产环境)
  • 删除不需要的文件夹

有人用JSBuilder或Apache Ant做过这个吗?我发现与Sencha Touch lib集成的JSBuilder解决方案非常错误并且没有文档记录。 Apache Ant完全适合像詹金斯这样的“更大”的构建或CI系统,但我错过了一个如何使用Sencha Touch应用程序实现这一目标的好例子。

所以问题是,Sencha Touch的构建脚本应该如何?

1 个答案:

答案 0 :(得分:2)

编辑:警告:这是一个老答案,今天可能有更好的方法来做到这一点。自2011年以来,javascript的现代构建工具已经走过了漫长的道路。

我今天确实做到了这一点。

首先我考虑使用sprockster,因为我喜欢c / c ++包含定义脚本依赖的样式。

我最终使用Apache ant,因为我的一些团队成员有点害怕ruby。 Apache ant似乎也是一个更通用且记录良好的工具。

我还没想出如何自动构建sass文件,但这不应该太难。

我使用的过程很简单:

  1. 连接所有js文件并将它们放在构建文件夹
  2. 缩小build文件夹中的所有js文件并将其重命名为* -min.js
  3. 将所有必需的文件复制到dist文件夹(包括图像,sencha-touch.js,索引文件等)
  4. 这就是我最终的结果:

    <project name="ProjectApp" default="dist" basedir=".">
        <description>
            Project Manager build file
            dist-debug is the target that's best for debugging
            Run ant dist-debug to build the project
        </description>
        <!-- set global properties for this build -->
        <property name="src" location="src"/>
        <property name="lib" location="lib"/>
        <property name="build" location="build"/>
        <property name="dist"  location="dist"/>
        <property name="utils"  location="utils"/>
        <property name="img"  location="img"/>
    
        <target name="init">
            <!-- Create the build directory structure used by compile -->
            <mkdir dir="${build}"/>
        </target>
    
        <target name="concatenate" depends="init" description="Concatenate all js files">
            <concat destfile="${build}/application.js" fixlastline="yes">
                <fileset file="${src}/js/app.js" />
                <fileset file="${src}/js/observablize.js" />
                <fileset file="${src}/js/config.js" />
    
                <!-- Models -->
                <fileset file="${src}/js/models/Project.js" />
                <fileset file="${src}/js/models/ProjectInformation.js" />
                <fileset file="${src}/js/models/Picture.js" />
                <fileset file="${src}/js/models/Milestone.js" />
                <fileset file="${src}/js/models/Risk.js" />
                <fileset file="${src}/js/models/data.js" />
                <fileset file="${src}/js/models/Invoice.js" />
                <fileset file="${src}/js/models/Customer.js" />
                <fileset file="${src}/js/models/OpenItem.js" />
                <fileset file="${src}/js/models/favorites.js" />
                <fileset file="${src}/js/models/mockObjects.js" />
    
                <!-- Database -->
                <fileset file="${src}/js/database/createTables.js" />
                <fileset file="${src}/js/database/database.js" />
                <fileset file="${src}/js/database/projectObserver.js" />
    
                <!-- Network -->
                <fileset file="${src}/js/network/network.js" />
                <fileset file="${src}/js/network/queries.js" />
                <fileset file="${src}/js/network/parseProjectServiceProject.js" />
                <fileset file="${src}/js/network/parseQueryEngineProjects.js" />
                <fileset file="${src}/js/network/parseDocArchiveSearchResponse.js" />
                <fileset file="${src}/js/network/parseDocArchiveDataResponse.js" />
                <fileset file="${src}/js/network/parseQueryEngineInvoices.js" />
                <fileset file="${src}/js/network/parseQueryEngineCustomer.js" />
    
                <!-- Views -->
                <fileset file="${src}/js/views/Viewport.js" />
                <fileset file="${src}/js/views/XTemplates.js" />
                <fileset file="${src}/js/views/Login.js" />
                <fileset file="${src}/js/views/ProjectList/ActionSheet.js" />
                <fileset file="${src}/js/views/ProjectList/ProjectView.js" />
                <fileset file="${src}/js/views/ProjectList/ProjectList.js" />
                <fileset file="${src}/js/views/ProjectList/ProjectsLists.js" />
                <fileset file="${src}/js/views/ProjectInfo.js" />
                <fileset file="${src}/js/views/ProjectRisks.js" />
                <fileset file="${src}/js/views/ProjectMilestones.js" />
                <fileset file="${src}/js/views/ProjectDetail.js" />
                <fileset file="${src}/js/views/Overlays.js" />
    
                <!-- Controllers -->
                <fileset file="${src}/js/controllers/login.js" />
                <fileset file="${src}/js/controllers/projects.js" />
            </concat>
        </target>
    
        <target name="compress" depends="concatenate" description="Compress application.js to application-min.js">
            <apply executable="java" parallel="false">
                <filelist dir="${build}" files="application.js" />
                <arg line="-jar" />
                <arg path="${utils}/yuicompressor-2.4.6.jar" />
                <srcfile />
                <arg line="-o" />
                <mapper type="glob" from="*.js" to="${build}/*-min.js" />
                <targetfile />
            </apply>
        </target>
    
        <target name="dist-debug" depends="concatenate" description="generate the distribution">
            <!-- Create the distribution directory -->
            <mkdir dir="${dist}"/>
    
            <!-- copy over the required files -->
    
            <!-- required libraries -->
            <!-- sencha touch -->
            <copy file="${lib}/sencha-touch/sencha-touch.js" todir="${dist}"/>
    
            <!-- stylesheet -->
            <copy file="${build}/application.css" todir="${dist}"/> 
    
            <!-- index file -->
            <copy file="${src}/index.html" todir="${dist}"/>
    
            <!-- manifest file -->
            <copy file="${src}/cache.manifest" todir="${dist}"/>
    
            <!-- app javascript -->
            <copy file="${build}/application.js" tofile="${dist}/application.js"/>
    
            <!-- images -->
            <copy file="${img}/icon.png" todir="${dist}"/>
            <copy file="${img}/startup.png" todir="${dist}"/>
            <copy file="${img}/disclosure.png" todir="${dist}"/>
    
        </target>
    
        <target name="dist" depends="dist-debug,compress" description="generate minified distribution"> 
            <!-- app javascript -->
            <copy file="${build}/application-min.js" tofile="${dist}/application.js"/>  
        </target>   
    
        <target name="clean" description="clean up" >
            <!-- Delete the ${build} and ${dist} directory trees -->
            <delete dir="${build}"/>
            <delete dir="${dist}"/>
        </target>
    
    </project>
    

    如您所见,我在项目中指定了每个文件。这只是为了让订单正确。如果您的代码写得比我的好,并且没有任何依赖,那么您可以只包含一个完整的源文件夹。