//ivy学习
一 ivy基本概念(http://ivy.group.iteye.com/group/wiki/1904-ivy-reference-index):
1 Organisation / 组织
类似maven POM 中的"groupId";
2 Module / 模块
对于ivy,一个模块就像一个修订版本链,每个修订版本由一个描述符和一个或多个artifact构成
3 模块描述符
模块描述符(通常被称为ivy.xml)是识别模块的一般方法:识别符(组织,模块名,分支和修订版本),
已发布的制品,可能的配置和依赖。
ivy同样兼容maven2的原数据格式(名为pom, Project Object Model, 项目对象模型), pom文件也可以
作为模块描述符使用。
由于ivy支持可插入式的模块描述符解析器,因此几乎可以使用任何东西作为模块描述符。
4 Artifact / 制品
制品是一个为模块修订版本的发布而准备的单独文件,作为开发的一个产品,如jar
5 模块修订本
修订本经常对应模块的一个发布版本
6 修订本状态
ivy默认定义三种状态
* integration/集成: continuous build,nightly build等产生的修订本归于此类
* milestone/里程碑: 发布给公众但是还没有真正完成的修订本归于此类
* release/发行: 完整测试并被打好标签的修订本归于此类
7 ivy设置文件(ivysettings.xml)
8 依赖解析器
依赖解析器是ivy中使用的可插入式的类:
* 发现ivy文件中的依赖
* 下载依赖的制品
依赖解析器可以被认为是负责描述仓库的类
9 变量
ivy变量可以被视为类似ant属性,但是,ant属性和ivy变量之间的最大差别在于ivy变量可以被覆盖,然
而ant属性不可以
当配置完成时,所有ant属性都被导入到ivy变量(如果是从ant中调用ivy)。这意味着如果你在调用配
置之后定义一个ant属性,它讲无法作为一个ivy变量来访问。另一方面,ivy变量不能导出到ant,所有如果
你在ivy中定义ivy变量,不要试图作为ant属性来使用它们
ivy变量使用方式: ${variablename}
10 模式
可以通过提供一个查找制品的模式来配置一个文件系统依赖解析器。这个模式类似这样:
myrepository/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]
模式是由标记组成的,当赋值给特定的制品或模块时标记被替换为实际的值
可以在模式中混合使用变量和标记:
${repository.dir}/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]
11 标记:
* [organisation] / [organization] 组织名
* [module] 模块名
* [branch] 分支名
* [revision] 修订本
* [artifact] 制品名(或者id)
* [type] 制品类型
* [ext] 制品文件扩展名
* [conf] 配置名
* [originalname] (since 1.4) 原始的制品名(包括扩展名)
在模式中可以使用可选部分,当标志没有定义时可避免某些输入,而不是仅仅得到一个空的标记。括号
被用于界定可选部分,并且在括号中只能有一个标记。因此如果在你在用'(' 和 ')'包围一个标记,如果标
记没有值则在括号之间的任何其他文本都将被忽略。
例子:模式[artifact](-[revision]).[ext]
让你同时接受在修订本被设置时的myartifact-1.0.jar和没有设置修订本时的myartifact.jar(而不是
myartifact-.jar)。在你需要保持对制品名的控制时非常有用。
从1.4开始,附加属性可以在模式中被当成任意其他标记被使用。
12 最新策略
ivy经常需要知道两个修订本之间哪个是最新。为了知道这个,ivy使用"最新策略"的概念。当然,有多
个方法可以考虑一个修订本是否是最新。你可以选择一个已经存在的或者插入你自己的。
ivy有三个内建的最新策略:
* latest-time
比较修订本时间来知道哪个是最新的。虽然相对来说这通常是一个好的策略,但是它有一个缺点,和远
程仓库进行推断是有代价的。例如如果你使用ivyrep,ivy不得不在知道哪个是最新的之前询问http服务器
每个ivy文件的日期。
* latest-revision
把修订本进行字符串比较,使用接近于php version_compare 函数的算法。这个算法被用于评估某些文
本的特殊含义。例如,这这个策略中,1.0-dev1 被认为在1.0-alpha1之前, 1.0-alpha1在1.0-rc1之前,
1.0-rc1在1.0之前, 1.0在1.0.1之前.
* latest-lexico
把修订本进行字符串比较,使用辞典顺序(这个方法被java strong 比较使用)
13 冲突管理器
冲突管理器可以在冲突的模块修订本列表中选择需要保留的修订本。
如果修订本对应相同的模块,举例说相同的组织/模块名对,那么称为冲突的修订本列表。
可用的冲突管理器列表在可以冲突管理器页面可以得到。
14 附加属性
15 校验和
16 事件和触发器
从1.4版本之后,当ivy完成依赖的解析和一些其他任务,ivy将在最重要的步骤前后发出事件。你可以
使用ivy的api来监听这些事件,或者你甚至可以注册一个触发器在特定事件发生时来执行特定的动作。
这是尤其强大而灵活的特性,例如它容许在依赖解析前执行依赖的构建,或者在依赖解析过程中精确地
追踪发生的事情。
17 循环依赖
从1.4版本之后,循环依赖可以是直接或者间接。例如,如果A依赖A,这是循环依赖,如果A依赖B而B依
赖A,这也是循环依赖。
循环依赖时的行为可以通过循环依赖策略来配置。
3个内建的策略可用:
* ignore/忽略
循环依赖仅仅用详细的信息警告进行标志。
* warn / 警告
和忽略相同,除非它们被标识为警告(默认)
* error / 错误
发现循环依赖时终止依赖解析
18 缓存和变更管理
ivy非常依赖本地缓存来避免过于频繁的访问远程仓库,从而节约网络带宽和时间。
ivy缓存由两个不同部分组成:
* 仓库缓存
仓库缓存是ivy保存从模块仓库下载的数据的地方,和一些关系到这些制品的元信息在一起,和他
们的原始位置一样。
* 解析缓存
这个部分的缓存用来保存被ivy用来重用解析过程的结果的解析数据。
这个部分的缓存每次完成一次新的解析时都被覆盖,并且决不能被多进程同时使用。
通常只有一个解析缓存,但是你可以定义多个仓库缓存,每个解析器可以使用单独的缓存。
19 变更管理
为了加快依赖解析和缓存使用的方法,ivy默认认为修订本从不修改。因此一旦ivy在它的缓存中有这个
模块(元数据或者制品),ivy信任缓存,甚至不再查询仓库。大多数情况下这个优化时非常有用的,并且只
要你遵循这个规范就不会引起问题: 修订本从不变更。
但有两种变更需要考虑:
(1)模块元数据变更
在你的依赖解析器上设置checkModified为"true"将是一个解决方案。这个标记告诉ivy需要检查模块的
元数据相比较缓存是否被修改. ivy首先检查仓库中元数据的最后修改时间以决定只在必要时下载它,同样
只在需要时更新它。
(2)制品变更
一些用户,尤其是从maven2过来的用户,喜欢使用一个特别的修订版本来处理经常变更的模块。在
maven2中这个通常被称为SNAPSHOT(快照)版本,并且有一种主张认为这样可以帮助节约空间,因为只需要为
开发时可能创建的大量的中间产物保留一个修订版本
ivy使用"changing revision"的概念来支持这种方法。changing revision就是这样:一个ivy认为随着
时间推移始终可能变更的修订版本.为了处理这个,可以通过使用依赖标签明确指定一个依赖为可以变更,
或者在解析器上使用changingPattern 和changingMatcher 属性来知名那个修订版本或者修订版本组可以被
认为是变更的
也要将解析器设置checkModified=true"
20 路径处理
(1)ivy有基准路径的概念,这个基本和ant一致。你可以使用变量ivy.basedir来访问这个基准目录。因此如
果你有类似这样的路径:
${ivy.basedir}/ivy.xml
(2)被用于实际定位文件的基准路径取决于相对路径在哪里被定义:
* 在ivy文件中,路径是相对于ivy文件自身(在ivy文件中唯一可能的路径是用于配置包含申明)。
* 在设置文件中,用于文件包含的路径(也就是属性文件装载和设置文件包含)是相对于设置文件所在的
目录。所有其他路径除非明确记录否则必须是绝对路径。
* 在ivy的ant任务和ivy参数或选项中,路径是相对于ivy基准路径的,当在ant中调用时这个路径就是
ant的basedir路径一致。
二 实用技巧:
1 ivy的默认配置: ivy-2.3.0.jar\org\apache\ivy\core\settings
2 在ant脚本中使用ivy: http://skydream.iteye.com/blog/437909
1 ivy的依赖库配置
2 ivy与eclipse工程的结合
3 ivy与ant的结合
4 ivy与maven的区别与联系
Q: AETL产品构建
D: AETL Jenkins上进行持续构建, 并对ivy和构建脚本有个初步的了解, 可进行本地构建
T:
怎样配置ivy依赖仓库,
在每个工程的ivysettings.xml中配置
怎样配置工程模块
怎样配置依赖(依赖如何寻找),
package-ivy.xml有啥用,
每个工程的build.xml作了什么事情,
总的构建脚本作了什么事情,
本地构建,
Jenkins上构建对环境的要求,如何构建,
产品形态有哪些,产品名称,Jenkins构建名称,建立Jenkins构建,整理构建文档
S:
1 理清kettle产品形态及名称,尝试本地构建,SVN内容提交后先把Jenkins构建建立起来
2 整理ivy知识,各类build脚本知识,构建知识
R:
(1)
(2)
(3)