【ANT】构建文件build.xml
运行ant:
ant 使用当前目录下的build.xml运行ant,指定缺省的target;
ant –buildfile mybuild.xml 使用当前目录下的mybuild.xml运行ant,并执行缺省的target;
ant –buildfile mybuild.xml mytarget使用当前目录下mybuild.xml运行ant,并执行名为mytarget的target;
编写build.xml
project
例如:
<project name="Cesium" default="combine">
属性:
name : 项目名称
default:指定运行的target名称,没有指定时使用缺省的target;
basedir:基准路径,其他的相对路径都是基于这个基准路径的;
description:项目描述信息。
target
<target name="combine" depends="build,combineJavaScript" description="Combines all source files into a single stand-alone script." />
注意:一个target可以依赖于其他target。例如combine依赖于build target和combineJaveScript target,ant会按照depends中target出现的顺序依次执行,并且每个target只会被执行依次,即使有多个target依赖于他。
target有以下属性:
name:target名称,这个属性是必须的;
depends:依赖目标,非必须
if:当属性设置时才执行该target,非必须;
unless:当属性没有设置时才执行该target,非必须;
description:target的描述信息,非必须;
task
Task分为内置task和自定义task,每个task都是一段可执行的代码。
内置task:
<copy file="${requirejsPath}/require.min.js" tofile="${cesiumViewerOutputDirectory}/require.js" />- 自定义task
调用任务:
<glslToJavascript minify="${build.minification}" minifystatefile="${buildDirectory}/minifyShaders.state"> <glslfiles dir="${shadersDirectory}" includes="**/*.glsl" /> <existingjsfiles dir="${shadersDirectory}" includes="**/*.js" excludes="*.profile.js" /> </glslToJavascript>定义任务:
<scriptdef name="glslToJavascript" language="javascript" src="${tasksDirectory}/glslToJavaScript.js" manager="bsf" classpathref="javascriptClassPath" loaderref="javascript.loader"> <attribute name="minify" /> <attribute name="minifystatefile" /> <element name="glslfiles" type="fileset" /> <element name="existingjsfiles" type="fileset" /> </scriptdef>这是glslToJavaScript.js源代码:
/*global importClass,project,attributes,elements,java,Packages*/
importClass(Packages.org.mozilla.javascript.tools.shell.Main); /*global Main*/
Main.exec(['-e', '{}']);
var load = Main.global.load; load(project.getProperty('tasksDirectory') + '/shared.js'); /*global forEachFile,readFileContents,writeFileContents,File,FileReader,FileWriter,FileUtils*/ importClass(java.io.StringReader); /*global StringReader*/
importClass(java.util.HashSet); /*global HashSet*/
importClass(Packages.org.apache.tools.ant.filters.StripJavaComments); /*global StripJavaComments*/ var minify = /^true$/.test(attributes.get('minify')); var minifyStateFilePath = attributes.get('minifystatefile');
writeFileContents(minifyStateFilePath, minify); var minifyStateFileLastModified = new File(minifyStateFilePath).lastModified(); // collect all currently existing JS files into a set, later we will remove the ones
// we still are using from the set, then delete any files remaining in the set.
var leftOverJsFiles = new HashSet(); forEachFile('existingjsfiles', function(relativePath, file) {
"use strict";
leftOverJsFiles.add(file.getAbsolutePath());
}); var builtinFunctions = [];
var builtinConstants = [];
var builtinStructs = []; forEachFile('glslfiles', function(relativePath, file) {
"use strict";
var glslFile = file;
var jsFile = new File(file.getParent(), file.getName().replace('.glsl', '.js')); // identify built in functions, structs, and constants
if(glslFile.getPath().indexOf('Builtin' + File.separator + 'Functions') !== -1) {
builtinFunctions.push(file.getName().replace('.glsl', ''));
}
else if(glslFile.getPath().indexOf('Builtin' + File.separator + 'Constants') !== -1) {
builtinConstants.push(file.getName().replace('.glsl', ''));
}
else if(glslFile.getPath().indexOf('Builtin' + File.separator + 'Structs') !== -1) {
builtinStructs.push(file.getName().replace('.glsl', ''));
} leftOverJsFiles.remove(jsFile.getAbsolutePath()); if (jsFile.exists() && jsFile.lastModified() > glslFile.lastModified() && jsFile.lastModified() > minifyStateFileLastModified) {
return;
} var contents = readFileContents(glslFile);
contents = contents.replace(/\r\n/gm, '\n'); var copyrightComments = '';
var extractedCopyrightComments = contents.match(/\/\*\*(?:[^*\/]|\*(?!\/)|\n)*?@license(?:.|\n)*?\*\//gm);
if (extractedCopyrightComments) {
copyrightComments = extractedCopyrightComments.join('\n') + '\n';
} if (minify) {
contents = String(FileUtils.readFully(new StripJavaComments(new StringReader(contents))));
contents = contents.replace(/\s+$/gm, '').replace(/^\s+/gm, '').replace(/\n+/gm, '\n');
contents += '\n';
} contents = contents.split('"').join('\\"').replace(/\n/gm, '\\n\\\n');
contents = copyrightComments + '\
//This file is automatically rebuilt by the Cesium build process.\n\
/*global define*/\n\
define(function() {\n\
"use strict";\n\
return "' + contents + '";\n\
});'; writeFileContents(jsFile.getAbsolutePath(), contents, true);
}); // delete any left over JS files from old shaders
for ( var it = leftOverJsFiles.iterator(); it.hasNext();) {
new File(it.next())['delete']();
} var generateBuiltinContents = function(contents, builtins, path){
"use strict";
var amdPath = contents.amdPath;
var amdClassName = contents.amdClassName;
var builtinLookup = contents.builtinLookup;
for (var i = 0; i < builtins.length; i++) {
var builtin = builtins[i];
amdPath = amdPath + ',\n \'./' + path + '/' + builtin + '\'';
amdClassName = amdClassName + ',\n ' + 'czm_' + builtin;
builtinLookup = builtinLookup + ',\n ' + 'czm_' + builtin + ' : ' + 'czm_' + builtin;
}
contents.amdPath = amdPath;
contents.amdClassName = amdClassName;
contents.builtinLookup = builtinLookup;
}; //generate the JS file for Built-in GLSL Functions, Structs, and Constants
var contents = {amdPath:'', amdClassName:'', builtinLookup:''};
generateBuiltinContents(contents, builtinConstants, 'Constants');
generateBuiltinContents(contents, builtinStructs, 'Structs');
generateBuiltinContents(contents, builtinFunctions, 'Functions'); contents.amdPath = contents.amdPath.replace(',\n', '');
contents.amdClassName = contents.amdClassName.replace(',\n', '');
contents.builtinLookup = contents.builtinLookup.replace(',\n', ''); var fileContents = '\
//This file is automatically rebuilt by the Cesium build process.\n\
/*global define*/\n\
define([\n' +
contents.amdPath +
'\n ], function(\n' +
contents.amdClassName +
') {\n\
"use strict";\n\
return {\n' + contents.builtinLookup + '};\n\
});'; var builtinFile = new File(project.getProperty('shadersDirectory') + '/Builtin', 'CzmBuiltins.js');
writeFileContents(builtinFile.getAbsolutePath(), fileContents, true);Scriptdef使用脚本语言定义一个ant task,ant scripting languanges支持BSF引擎和JSR_223引擎来定义脚本。
属性:
name : 任务名称,必需;
language : 脚本语言,必须被BSF或者JSR引擎支持,必须;
manager : BSF或者JSR引擎;
src :执行任务的脚本路径
uri : xml 命名空间;
classpath : script引入的class的classpath路径
classpathref : 使用refid引入classpath;
loaderfef : 加载script的loader,从指定的classpath来构造
【ANT】构建文件build.xml的更多相关文章
- 【ANT】一个简单的ANT生成文件build.xml
<?xml version="1.0" ?> <project default="test"> <target name=&quo ...
- 项目打包文件build.xml
Make命令其实就是一个项目管理工具,而Ant所实现功能与此类似.像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷.最初Ant开发者在开发跨平台的应用 ...
- Android开发之深入理解Android Studio构建文件build.gradle配置
摘要: 每周一次,深入学习Android教程,TeachCourse今天带来的一篇关于Android Studio构建文件build.gradle的相关配置,重点学习几个方面的内容:1.applica ...
- java ant 编译打包build.xml完整配置范例
java ant 编译打包build.xml完整配置范例 <?xml version="1.0" encoding="UTF-8" ?> <p ...
- Ant构建文件解析
<?xml version="1.0" encoding="UTF-8"?> <!-- 在Ant脚本中,project是这个XML文档的根结点 ...
- ant+jmeter中build.xml配置详解
- java分享第二十天(build.xml的语法及写法)
通常情况下,Ant构建文件build.xml应该在项目的基础目录.可以自由使用其他文件名或将构建文件中其他位置.在本练习中,创建一个名为build.xml 在电脑的任何地方的文件. <?xml ...
- [Android] 基于 Linux 命令行构建 Android 应用(五):Ant 构建命令
Android SDK 提供的 android 工具可以在项目根目录自动生成 Ant 构建文件 build.xml[1].进入项目根目录后,你可以使用以下 Ant 命令[2]. ant clean 清 ...
- Ant构建原理及build.xml文档描述
最近在改写jmeter,用到ant构建,记录一下. Ant的概念Make命令是一个项目管理工具,而Ant所实现功能与此类似.像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant ...
随机推荐
- POJ 3321 Apple Tree (树状数组+dfs序)
题目链接:http://poj.org/problem?id=3321 给你n个点,n-1条边,1为根节点.给你m条操作,C操作是将x点变反(1变0,0变1),Q操作是询问x节点以及它子树的值之和.初 ...
- typdef struct 语法
1:结构体 C语言中定义一个结构体的语法如下: struct tagMyStruct { int age; int sex; }; 其中,tagMyStruct是结构体名,在使用时,需要和struct ...
- jqGrid 学习
jqGrid 学习: 一.下载需要的jqGrid包:http://www.trirand.com/blog/?page_id=6 二.下载JQuery UI:http://jqueryui.com/d ...
- Realsense 人脸识别
一.代码声明 下面的代码是博主参考了Intel realsense官方SDK和官方例程后写的一段较为简单的代码,实现了简单的多人脸实时检测及跟踪功能.官方的人脸检测例程功能较多,但代码量很大,阅读起来 ...
- oracle连接数据的oci和thin的区别
1)从使用上来说,oci必须在客户机上安装oracle客户端或才能连接,而thin就不需要,因此从使用上来讲thin还是更加方便,这也是thin比较常见的原因.2)原理上来看,thin是纯java实现 ...
- Codeforces Gym 100418A A - A+-B java高精度
A - A+-BTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.acti ...
- MyBatis之二:简单增删改查
这一篇在上一篇的基础上简单讲解如何进行增删改查操作. 一.在mybatis的配置文件conf.xml中注册xml与注解映射 <!-- 注册映射文件 --> <mappers> ...
- PACPerformance
https://github.com/kickfjq/android_packages_apps_PACPerformance
- aspose.cells 模版
aspose.cells 模版 http://www.cnblogs.com/whitewolf/archive/2011/03/21/Aspose_Cells_Template1.html
- MHA手动在线切换主 原创3(主不参与复制)
monitor 执行:slave2连接到slave1,server1 不做(主/从复制角色,停在那里) [root@monitor app1]# masterha_master_switch --co ...