這裏我所做的:
- 我創建了一個名爲
ivy.dir
一個Subversion項目。
- 在這個
ivy.dir
項目中,我有最新的ivy.jar。
- 在
ivy.dir
中,我爲我們的環境設置了ivysettings.xml
。例如,我們爲我們自己的罐子使用一個本地的Artifactory Maven倉庫。 ivy.dir
項目中的ivysettings.xml
指出這一點。
- 我創建了一個名爲
ivy.tasks.xml
的文件。這是一個Ant構建文件。
的ivy.tasks.xml
看起來是這樣的:
<project name="Ivy.Tasks"
xmlns:ivy="http://ant.apache.org/ivy"
xmlns:jacoco="antlib:org.jacoco.ant">
<property environment="env"/>
<!-- Add Ivy Tasks -->
<taskdef uri="http://ant.apache.org/ivy"
resource="org/apache/ivy/ant/antlib.xml">
<classpath>
<fileset dir="${ivy.dir}">
<include name="ivy*.jar"/>
</fileset>
</classpath>
</taskdef>
<ivy:settings file="${ivy.dir}/ivysettings.xml"/>
</project>
請注意,我有我自己的常青藤設置,謝謝。我沒有必要在ivy.jar
(儘管我可以有,因爲每個人都會使用我的ivy.jar
文件!)。我ivysettings.xml
看起來是這樣的:
<ivysettings>
<!-- I'll explain this part below -->
<property name="env.EXECUTOR_NUMBER" value="0" override="false"/>
<caches
defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}"
resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/>
<!-- Just the standard stuff you find in the `ivysettings.xml in the ivy.jar -->
<settings defaultResolver="default"/>
<include file="${ivy.dir}/ivysettings-public.xml"/> <!-- This one is different -->
<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>
最大的變化是ivysetting-public.xml
文件:
<ivysettings>
<resolvers>
<ibiblio name="public"
m2compatible="true"
checkmodified="true"
root="http://repos.vegicorp.com/artifactory/libs-release" />
</resolvers>
</ivysettings>
它指向我的本地倉庫 - 我Artifactory的服務器。
現在,開發人員使用常春藤,所有他們需要做的是:
- 在他們在Subversion項目的根目錄,添加
svn:external
。這個svn:external
將用於將我的ivy.dir
項目帶入他們的Subversion項目中。
- 在build.xml
- 常春藤命名空間定義在
<project>
定義添加到他們的build.xml
。
- 設置屬性
ivy.dir
成`$ {BASEDIR} /ivy.dir。
- 使用
<import>
任務導入${ivy.dir}/ivy.tasks.xml
到他們build.xml
文件。
事情是這樣的:
<project name="post-a-matic" default="package" basedir="."
xmlns:ivy="http://ant.apache.org/ivy">
<property name="ivy.dir" value="${basedir}/ivy.dir"/>
<import file="${ivy.dir}/ivy.tasks.xml"/>
<!-- A whole bundle of properties are set -->
<target name="clean">
<delete dir="${target.dir}"/>
<ivy:cleancache/> <!-- Look: They have access to Ivy! -->
</target>
<target name="-resolve">
<ivy:resolve/>
</target>
<target name="compile"
depends="-resolve">
<ivy:cachpath
pathid="main.classpath"
conf="compile,provided"/>
<!-- Boy that's easy! -->
<javac srcdir="${main.srcdir}"
destdir="${main.destdir}"
classpathref="main.classpath"/>
</target>
<!-- On and on -->
這解決了很多問題:
- 您可以更新
ivy.settings
,每個人都會有更新的設置。這對我們來說非常重要,因爲我們使用Jenkins,並且我希望Jenkins清理每個構建的常青藤緩存。哎呦!這清除了同時執行的構建中的常青藤緩存!我通過更改ivysettings.xml
文件來爲每個Jenkins構建執行程序定義不同的Ivy緩存來解決此問題。其中詹金斯服務器,你有常春藤緩存稱爲$HOME/.ivy2/cache-0
,$HOME/.ivy2/cache-1
等。每個執行人可以刪除它自己的常青藤緩存,而不影響其他人。用戶,同時將只有$HOME/.ivy2/cache-0
。
- 當新的罐子出來時,你也可以更新常春藤。你更新你的Ivy jar文件,每個人都得到相關的。
- 很大的一個原因是當項目檢出時,常春藤會自行安裝。
- 和一個額外的特別獎勵:你可以使用你的
ivy.dir
和ivy.tasks.xml
文件來安裝其他任務。例如,我們的每一個項目必須通過Findbugs,PMD,CPD(PMD的項目,Checkstyle的一部分運行本身,並使用JaCoCo。對於測試覆蓋率。
這些項目中的每一個由一個jar文件,和一個<taskdef>
來將任務定義拉入Ant中,並且你怎麼也使用這些任務?它們沒有在標準的Ant模型中定義,開發人員也不知道如何使用它們。這些罐子到我ivy.dir
項目,並安裝了所有的任務定義爲我的ivy.tasks.xml
文件。我還定義了易於使用的<macrodef>
大多數這些任務,所以開發人員很容易使用它們。事實上,我甚至包含了舊的Ant-Contrib任務,只是爲了好玩。
現在,一旦你添加ivy.dir
到你的項目,你把所有的這些額外的任務,你有什麼可安裝在機器上。
大衛,你能爲我提供某種資源的,這樣我可以反映這個設置?據我所知,我們只是運行svn,而不是Svn:外部和我的團隊正在尋找我設置的東西,這聽起來像處理(並超出)我們當前的所有問題。 謝謝 –