Sky's blog

我和我追逐的梦

常用链接

统计

其他链接

友情链接

最新评论

ivy教程(3)-调整默认设置


    ivy绑定一些默认设置,这使得在通常环境下使用ivy很容易。这个教程,接近于参考文档,解释这些默认设置是什么和他们怎样调整来满足你的需要。

    为了完整的理解设置的概念和你可以用它们做什么,我们建议阅读其他和设置相关的教程(如Multiple ResolversDual Resolver)或者设置文件的参考文档。

1) 概念

    默认设置主要是3种仓库组成:

    * local / 私有
      用户私有的仓库

    * shared / 共享
      在团队的所有成员之间共享的仓库。

    * public / 公共
      可以找到大部分模块,尤其是第三方模块的公共仓库.

    注意如果你独自工作,local和shared仓库之间的差异不重要,但是需要知道如何识别它们。

    现在让我们更详细的描述这些仓库概念的每一个。后面我们会描述如何实际配置它们。

    1. local / 私有

    当你想做一些事情而不希望被环境中发生的其他任何事情打扰时,私有仓库非常有用。这意味着每当ivy能够在这个仓库中找到模块时,这个模块将被使用,不管其他仓库里的是什么。

    举例,如果你有一个模块,声明依赖于模块foo的latest.integration修订版本,然后当foo的一个修订版本在私有仓库中被发现,这个版本将被使用,即使在其他仓库中有一个更新的修订版本可用。

    这可能让你们中的某些人困惑,但是想象你不得不在一个项目中实现一个新的特性,并且为了达到这个目标你需要修改两个模块:你在模块foo内增加一个新的方法,并在模块bar中利用。然后如果你公布模块foo到你的私有仓库,你可以保证在你的bar模块中得到它,即使有其他人在shared仓库中公布了foo的一个新的修订版本。

    但是小心,当你完成你的开发并且公布它到共享仓库时,你将不得不清理你的本地仓库以便从在共享仓库中公布的新版本中获益。

    同样注意,在本地仓库中找到的模块必须是完整的,换句话说,他们必须同时提供模块描述符和发行的制品。

    2. shared / 共享

    如它的名字建议的,共享仓库的目标是在整个开发团队中共享。例如你可以公布你的团队的私有模块,同样你可以放置一些在公共仓库中不能得到的模块(例如sun的jar文件),或者仅仅是不精确(例如坏的或者不完整的模块描述符).

    注意模块可以在共享仓库和公共仓库中分隔:例如你可以在共享仓库中有模块的描述符而制品在公共仓库中。

    3. public / 公共

    大多数模块可以在公共仓库中找到,但是某些时候缺少你要的信息。这通常是一个只能通过internet连接访问的仓库,虽然这不是强制。

2) 安装仓库

    现在我们已经看到三个仓库中的每一个的目标,让我们看怎样安装他们并配置以便满足你的需求。

    首先,几个仓库在你的文件系统中使用同一个root。被作为${ivy.default.ivy.user.dir}引用,默认为在你的user home下的.ivy2 目录。

    注意几个东西可以通过设置ivy变量来完成。为了不定义你自己的ivysettings.xml文件而设置他们,你可以:

    * 在任何ivy调用前,在你的构建文件中设置一个ant属性,如果你通过ant使用ivy
    * 设置一个环境变量,如果你通过命令行使用ivy

    举例:
<target name="resolve">
  
<property name="ivy.default.ivy.user.dir" value="/path/to/ivy/user/dir"/>
  
<ivy:resolve />
</target>

   现在我们将展示如何为不同类型的仓库覆盖默认值,注意你可以在下面的默认设置的细节中发现这些默认值是什么。

    1. Local

        默认,本地仓库位于${ivy.default.ivy.user.dir}/local.这通常是一个不错的地方,但是如论如何你可能需要修改它。没有问题,你只需要设置下面的ivy变量到你想使用的目录:
ivy.local.default.root
    例如:
ivy.local.default.root=/opt/ivy/repository/local

    如果你已经有了一些你想作为你的本地仓库来使用的东西,你可能同样想修改这个仓库的布局。再一次,有两个变量可用于此:
ivy.local.default.ivy.pattern
给出查找ivy文件的样式

ivy.local.default.artifact.pattern
给出查找制品的样式

例如:
ivy.local.default.root=/opt/ivy/repository/local
ivy.local.default.ivy.pattern=[module]/[revision]/ivy.xml
ivy.local.default.artifact.pattern=[module]/[revision]/[artifact].[ext]

    2. Shared

    默认,本地仓库位于${ivy.default.ivy.user.dir}/shared.如果你独自工作没有问题,但是共享仓库是用来共享的!因此经常需要修改这个目录,并且它通常修改为指向一个网络共享目录。你可以使用:
ivy.shared.default.root
变量来制定一个新的目录。此外,你也可以通过和本地仓库类似的变量来配置布局。

ivy.shared.default.ivy.pattern
给出查找ivy文件的样式

ivy.shared.default.artifact.pattern
给出查找制品的样式

例如:
ivy.shared.default.root=/opt/ivy/repository/shared
ivy.shared.default.ivy.pattern=[organisation]/[module]/[revision]/ivy.xml
ivy.shared.default.artifact.pattern=[organisation]/[module]/[revision]/[artifact].[ext]

    3. Public
    默认,公共仓库是出于m2 兼容模式下的ibiblio(换句话说,maven2的公共仓库).

    这个仓库的优势在于提供了很多模块并且大部分的模块都有metadata。matadata的质量不是都很完美,但是它是一个好的开始:使用类似ivy这样的工具并从间接依赖管理的能力中获益。

    尽管ivy容易使用,我们建议阅读最佳实践来理解使用公共的、无法管理的仓库的正面和负面。

    在1.4版本中ivy使用ivyrep作为默认的解析器,如果你想恢复成这个方式,可以设置ivy.14.compatible=true 作为一个ant属性。

3) 走的更远

    好,我们已经看到修改这三个主要仓库的设置是很容易的。但是在web服务器上我的共享仓库是什么?如果你不想使用maven2 仓库作为公共的仓库。或者其他...

    没有问题,ivy富有弹性并且可以用非常特殊的设置进行配置以满足你的需要和环境。但是在考虑你自己的设置前,我们建议阅读后面的内容,你将要学习如何修改默认设置的一部分并调整其他。

    但是在解析如何做之前,你需要对ivy默认是如何配置的有一个简短的概述。

    默认,ivy使用被打包在ivy的jar包中的ivysettings.xml来配置。这里是设置文件:
<ivysettings>
  
<settings defaultResolver="default"/>
  
<include url="${ivy.default.settings.dir}/ivysettings-public.xml"/>
  
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
  
<include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
  
<include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
  
<include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>

    好,这里没有太多的信息,除了一些包含。这些包含的目的是你能够容易的仅仅修改ivysettings的一部分而直接使用其他。例如,如果你想定义你自己的公共解析器,你将只需要像这样通过ivysettings来配置ivy:
<ivysettings>
  
<settings defaultResolver="default"/>
  
<include url="http://myserver/ivy/myivysettings-public.xml"/>
  
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
  
<include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
  
<include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
  
<include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>

    注意仅仅是ivysettings-public包含被修改为包含自产的公共解析器。注意同样可以像这样使用,感谢${ivy.default.settings.dir} 是一个变量的事实,这个变量经常设置为ivy默认设置文件所在的地方(换句话说,被打包在jar中)。为了完成这个例子,你必须写你自己的ivysettings文件(那样你在这里例子中你将使得http://myserver/ivy/myivysettings-public.xml可用)来定义你自己的公共解析器。例如:
<ivysettings>
  
<resolvers>
    
<filesystem name="public">
      
<ivy pattern="/path/to/my/public/rep/[organisation]/[module]/ivy-[revision].xml" />
      
<artifact pattern="/path/to/my/public/rep/[organisation]/[module]/[artifact]-[revision].[ext]" />
    
</filesystem>
  
</resolvers>
</ivysettings>

现在为了正确地从默认设置中获益,你需要做的最后一件事情是每个包含的ivysettings文件的内容:

ivysettings-public.xml
<ivysettings>
  
<resolvers>
    
<ibiblio name="public" m2compatible="true"/>
  
</resolvers>
</ivysettings>

ivysettings-shared.xml
<ivysettings>
  
<property name="ivy.shared.default.root"             value="${ivy.default.ivy.user.dir}/shared" override="false"/>
  
<property name="ivy.shared.default.ivy.pattern"      value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
  
<property name="ivy.shared.default.artifact.pattern" value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
  
<resolvers>
    
<filesystem name="shared">
      
<ivy pattern="${ivy.shared.default.root}/${ivy.shared.default.ivy.pattern}" />
      
<artifact pattern="${ivy.shared.default.root}/${ivy.shared.default.artifact.pattern}" />
    
</filesystem>
  
</resolvers>
</ivysettings>

ivysettings-local.xml
<ivysettings>
  
<property name="ivy.local.default.root"             value="${ivy.default.ivy.user.dir}/local" override="false"/>
  
<property name="ivy.local.default.ivy.pattern"      value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
  
<property name="ivy.local.default.artifact.pattern" value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="false"/>
  
<resolvers>
    
<filesystem name="local">
      
<ivy pattern="${ivy.local.default.root}/${ivy.local.default.ivy.pattern}" />
      
<artifact pattern="${ivy.local.default.root}/${ivy.local.default.artifact.pattern}" />
    
</filesystem>
  
</resolvers>
</ivysettings>

ivysettings-main-chain.xml
<ivysettings>
  
<resolvers>
    
<chain name="main" dual="true">
      
<resolver ref="shared"/>
      
<resolver ref="public"/>
    
</chain>
  
</resolvers>
</ivysettings>

ivysettings-default-chain.xml
<ivysettings>
  
<resolvers>
    
<chain name="default" returnFirst="true">
      
<resolver ref="local"/>
      
<resolver ref="main"/>
    
</chain>
  
</resolvers>
</ivysettings>

    在这里,你有足够的提示来配置你想要的方式...查阅设置文档来看你想要做的是不是可能,并继续前行!


posted on 2009-09-24 20:58 sky ao 阅读(4457) 评论(0)  编辑  收藏 所属分类: project building


只有注册用户登录后才能发表评论。


网站导航: