D:\build>cvs -d :pserver:anonymous@dev.eclipse.org:/home/eclipse
export -r R3_0_2 org.eclipse.releng.eclipsebuilder |
org.eclipse.releng.eclipsebuilder中的readme.html描述了如何构建一个eclipse的组件。
在默认的情况下,为了获取3.0.0版本的sdk.examples,我们需要修改org.eclipse.releng.eclipsebuilder/sdk.examples/build.properties文件。
mapVersionTag=R3_0_0
现在我们可以在控制台的命令行中开始构建过程。
- D:\build\org.eclipse.releng.eclipsebuilder>set
ECLIPSE_HOME=D:\eclipse\eclipse-3.0.0
- D:\build\org.eclipse.releng.eclipsebuilder>java
-cp %ECLIPSE_HOME%\startup.jar org.eclipse.core.launcher.Main
- -application org.eclipse.ant.core.antRunner -buildfile
build.xml
- -Dcomponent=sdk.examples -Dconfigs="*,*,*"
-Dbaseos=win32 -Dbasews=win32 -Dbasearch=x86 -Djavacfailonerror=true
- -Dpde.build.scripts=%ECLIPSE_HOME%/plugins/org.eclipse.pde.build_3.0.0/scripts
-DbaseLocation=%ECLIPSE_HOME%
|
命令行中的compoent属性是你将要构建的组件名称。也就是你在d:\build\org.eclipse.releng.eclipsebuilder目录下的一个子目录的名称。在这个子目录下有build.properties和customTargets.xml文件。
Build脚本将会使用d:\build\org.eclipse.releng.eclipsebuilder\src目录作为默认的build目录。你也可以将-DbuildDirectory=${basedir}/newDirectory加入到命令行中指定你自己的build目录。
构建完成之后,装配完成的可分发的软件包和构建日志位于build目录下的一个子目录,这个子目录的名字由buildLabel属性定义。默认的这个目录的名称由”I-”开始,并包含构建时刻的时间戳。
命令行中的baseLocation属性用户指定eclipse启动的目录。同时,构建过程中如果在build目录中找不到一个plugin,会到baseLocation目录去查找。因此,在你自己的构建过程中的第三方的插件也应该位于%baseLocation%/plugins目录下,才能保证构建过程成功。BaseLocation目录下不能包含任何你将要构建的插件,如果baseLocation目录下包含了sdk.examples,构建过程将会出错。
3.4构建过程分析
在下面的部分我们将为你分析构建过程中的一些细节。首先我们先熟悉一下和构建有关的几个重要文件和他们的位置:
build.xml
位于 org.eclipse.pde.build_<version>/scripts 目录下。该文件提供了一个从prebuild到postbuild的过程的一个骨架。
genericTargets.xml
位于org.eclipse.pde.build_<version>/scripts目录下。包含了像fetchElement,
generateScript, processElement, assembleElement等Ant Task。
customTargets.xml
位于org.eclipse.releng.eclipsebuilder目录的子目录下。如sdk.examples.customTargets.xml文件将会被org.eclipse.releng.eclipsebuilder目录下的build.xml文件调用。在customTargets.xml文件中将会调用genericTargets.xml文件中的target。CustomTargets.xml文件的主要职责是定义将要构建的features和从那里得到构建过程中需要的map文件。关于map文件将会在后边介绍。
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属性就可以了。
构建你自己的插件,你需要准备四个文件: