4. build.properties
位于org.eclipse.releng.eclipsebuilder目录的子目录下。Build.properties属性文件中定义了一些构建过程中build脚本使用的一些属性。
下面我们来看一下整个构建过程的序列图如下:
上面的序列图给出了整个构建过程的一个概览。
1.D:\build\org.eclipse.releng.eclipsebuilder目录下的build.xml首先会设置一些与构建过程有关的环境设置变量,然后调用$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的build.xml文件。
2.$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的build.xml文件会一次调用自身的preBuild,fetch,generate,process,assemble,postBuild的几个target。在这几个target中又会一次调用customTargets.xml文件。所以说build.xml是整个构建过程的骨架,它定义了构建过程中的“构建准备”,“fetch构建所需资源”,“生成插件构建所需build.xml文件”,“编译”,“组装”,“构建完成后的相关工作”等阶段。
3.PreBuild过程中要做的一件重要事情就是回调customTargets.xml文件的getMapFiles Target获取map文件。Map文件定义了将要构建的所有插件在cvs中的位置。Map文件的格式如下: feature|fragment|plugin@elementId=<cvs tag>,<access method>:<cvsuser>@<cvs repository>,<cvs password>[,<repository path> (no starting slash) ] Map文件从cvs获得后会放在buildDirectory目录下的map子目录下。Map文件可以是有多个的,脚本会将map目录下的所有map文件连接为${buildDirectory}/directory.txt文件。
4.fetch过程同样会调用customTargets.xml文件中的allElements target。AllElements Target又将调用$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的genericTargets.xml文件的fetchElement target。FetchElement target中会调用eclipse内置的Ant Task “eclipse.fetch”。“eclipse.fetch”会自动生成一个fetch_${plugin_id}.xml文件。它生成的原理是分析feature.xml文件,获取一个feature内包含的所有插件id, 然后在map文件中查找插件在cvs中的位置并生成fetch_$(plugin_id).xml文件。然后会执行该fetch文件将插件代码获取到本地构建机器上。
5.Generate过程同样会回调customTargets.xml文件的allElements target。AllElements target又将调用$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的genericTargets.xml文件的generateScript target。GenerateScript Target中会调用eclipse内置的Ant Task “eclipse.buildScript”。“eclipse.buildScript”的作用是根据插件下的plugin.xml文件生成构建插件所需的build.xml文件。大家注意到在脚本中将这个过程自动化了。同样的我们可以在ide环境中的插件开发透视图中选中一个plugin.xml文件,执行右键菜单中的pde tools->Create Ant Build File命令生成build.xml文件。如下图所示:
但是,在开发过程中经常会添加对新的插件的引用而没有重新生成build.xml文件,这是导致构建过程失败的主要原因。另外一个缺点是如果使用在ide环境中生成的build.xml文件,构建环境必须和ide环境设置一样。开发环境和构建环境设置不一样也是导致构建过程失败的最常见的原因。
在构建时刻生成build.xml文件可以避免以上两个缺点。
6.Process过程同样也会回调customTargets.xml文件的allElements target。AllElements target又将调用$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的genericTargets.xml文件的processElement Target。 ProcessElement Target调用自动生成的插件build.xml文件,完成对插件的构建。
7.Assemble过程将完成插件的组装过程。
8.PostBuild过程回调customTargets.xml的postBuild target。
3.5构建你自己的插件
前面我们构建了sdk.examples,并且分析了整个自动构建的全过程。采用上面介绍的构建方法有一个限制就是你必须有一个feature项目。如果没有就先建立一个。菜单路径是File->New->Project...->Plug-in Development->Feature Project。在打开的向导中输入feature项目的名称,然后选择你要构建的插件并且包含到feature项目中。如果你不想将你要发布的plugin部署为一个feature,你只需要修改feature项目中的build.properties文件,删除掉bin.includes属性就可以了。
构建你自己的插件,你需要准备四个文件:
1.a map file for fetching the sources ,map文件一般情况下是存放在cvs中,在构建开始时从cvs下载。
2.customTargets.xml ,customTargets.xml文件位于位于d:\build\org.eclipse.releng.eclipsebuilder目录的子目录下。如sdk.examples。org.eclipse.releng.eclipsebuilder是eclipse的release engine。可以从eclipse的cvs中获得。
3.build.properties ,build.properties文家定义了构建过程中使用的环境变量。你可以根据自己的情况修改。
4.a shell script, which starts an Eclipse instance as AntRunner。运行Eclipse实例的脚本。在本文的前面已经有过介绍。
下面是一个Map文件片断的示例,你可以根据你自己的情况修改用户名,密码,package名称,和CVS分支名称。
feature@org.rubypeople.rdt=HEAD,:ext:cvs.sf.net:/cvsroot/rubyeclipse,,org.rubypeople.rdt-feature plugin@org.kxml2=HEAD,:ext:cvs.sf.net:/cvsroot/rubyeclipse, plugin@org.rubypeople.rdt=HEAD,:ext:cvs.sf.net:/cvsroot/rubyeclipse, plugin@org.rubypeople.rdt.core=HEAD,:ext:cvs.sf.net:/cvsroot/rubyeclipse, | CustomeTargets.xml提供了构建过程中回调的钩子。CustemerTargets.xml文件的模板在org.eclipse.pde.build插件的script目录下可以找到。下面是customerTargets.xml文件的一个片断。allElements target中定义了你要构建的feature id。这里的feature id不是feature manifest文件中定义的feature,而是用于在map文件中查找cvs信息时使用的id。getMapFiles target会将map文件下载到本地的${buildDirectory}目录下。Assemble target会调用生成的assemble脚本文件对编译结果进行组装。
<target name="allElements"> <ant antfile="${genericTargets}" target="${target}" > <property name="type" value="feature" /> <property name="id" value="org.rubypeople.rdt" /> </ant> </target> <target name="getMapFiles"> <property name="cvsRoot" value=":ext:cvs.sf.net:/cvsroot/rubyeclipse" /> <cvs cvsroot="${cvsRoot}" dest="${buildDirectory}/maps" command="export -r ${mapVersionTag} org.rubypeople.rdt.build/map"/> </target> <target name="assemble.org.rubypeople.rdt"> <ant antfile="${assembleScriptName}" dir="${buildDirectory}"> <property name="zipargs" value="" /> </ant> </target> | 结论
回顾一下整个构建过程,在customTargets.xml文件中我们定义了每一构建过程中供$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的build.xml文件回调的target。对于一些复杂的通用功能如生成获取cvs中插件代码的fetch.xml文件、生成build.xml文件等由genericTargets.xml来完成。这样一种结构最大限度的保证了customTargets.xml文件的简洁性、可维护性、可扩充性。Eclipse提供了这样一个优雅的构建脚本框架,用户只需要编写自己的customTargets.xml文件。CustomTargets.xml文件的模板可以在$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts找到。我们只需要拷贝一个,然后稍加修改就可以完成该项工作。
CustomTargets.xml文件中预定义了很多和构建过程对应的target。这些target都会被$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts调用。一个例子可以很好的说明这种回调的方便性。当我们构建一个包含有help文件的插件时,一个预先要做的工作就是先要将help文件打包成zip文件。我们可以修改customTargets.xml中的preProcess Target:
|