编辑:警告:这是一个旧答案,今天可能有更好的方法来做到这一点。自 2011 年以来,现代的 JavaScript 构建工具已经走过了漫长的道路。
我今天实际上就是这样做的。
首先我考虑使用 srockster,因为我喜欢 c/c++ 包含定义脚本依赖项的风格。
我最终使用了 Apache ant,因为我的一些团队成员有点害怕 ruby。Apache ant 似乎也是一个更通用且有据可查的工具。
我还没有弄清楚如何自动构建 sass 文件,但这应该不会太难。
我使用的过程很简单:
- 连接所有 js 文件并将它们放在 build 文件夹中
- 缩小 build 文件夹中的所有 js 文件并重命名为 *-min.js
- 将所有需要的文件复制到 dist 文件夹(包括图像、sencha-touch.js、索引文件等)
这就是我最终得到的:
<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>
如您所见,我指定了项目中的每个文件。这只是为了让订单正确。如果您的代码比我的写得更好,并且没有任何依赖项,您可以只包含整个源文件夹。