2008-12-09 124 views
24

我完全茫然如何螞蟻任務常春藤:發佈應該工作。常春藤:發佈工作?

我希望,我做我的正常建設,創造了一堆jar文件的話,我將推動這些罐子(局部)存儲庫。

如何從何處檢索內置罐子指定,而這些將如何在倉庫中結束了?

更新:

<target name="publish-local" description="--> Publish Local"> 
    <ivy:retrieve /> 
    <ivy:publish resolver="local" pubrevision="${release.version}" status="release" update="true" overwrite="true"> 
     <artifacts pattern="${dist.dir}/[organisation]-[module].[ext]" /> 
    </ivy:publish> 
</target> 

這種實際工作,我不包括前的檢索。

但是我仍然有一些問題,假設我想發佈3個jar包,openscada-utils.jar,openscada-utils-sources.jar和openscada-utils-javadocs.jar爲openscada-utils-0.9.2.jar ,openscada-utils-0.9.2-sources.jar和openscada-utils-0.9.2-javadocs.jar

我不完全清楚,實際名稱是如何組裝的,以及我可以在哪裏指定他們應該得到的名字。 (使用上面的片段,jar總是隻被稱爲utils.jar)。

更新1:

我得到它的工作(有點),但它仍然感覺不對。不知何故,所有教程都關注來自第三方項目的依賴關係,但對我來說同樣重要的一點是處理項目特定的依賴關係。

我有一大堆其中以各種方式互相依賴的子項目。考慮到常春藤:發佈我不清楚如何開始。

  1. 如何處理第一個版本?對於所有子項目,我都有一個共同的版本號來表示它們屬於一起(可以說0.9)。因此,第一次修訂應該是0.9.0,但到目前爲止,我的項目庫中沒有任何項目在我的存儲庫中。我如何獲得常春藤來分配此修訂版號。

  2. 在開發我想再次發佈內置的文件,在不改變版本號至今的過程。

  3. 如果我完成了我的工作,我想把它推到一個共享的存儲庫(並且將修訂號從0.9.0增加到0.9.1),那麼建議的方法是什麼?

  4. 對於實際發佈,我想使分佈有依賴性,無,不知何故,我想我可以使用不同的配置爲。我怎樣才能利用這些優勢?

+0

根據[this](http://ant.apache.org/ivy/history/latest-milestone/use/deliver.html)的簡單供參考,`deliver`任務由`publish`任務調用。 – itudoben 2012-08-28 17:29:14

回答

9

您需要指定「解析器」。例如:

<ivy:publish resolver="local" pubrevision="1.0"/> 

它受模式控制。這page覆蓋它很好。它看起來像你想你的是:

<artifacts pattern="${dist.dir}/[organisation]-[module]-[revision]-[type].[ext]" /> 

你還需要找出三個罐子作爲ivy.xml文件假象。類似這樣的:

<publications> 
    <artifact name="utils"/> 
    <artifact name="utils" type="source"/> 
    <artifact name="utils" type="javadocs"/> 
</publications> 
0

認識常春藤在這裏做什麼很重要。它不是簡單地將你的神器罐子複製到常青藤資源庫中 - 它還會生成相關的「.ivy.xml」文件,它們指定每個工件的所有依賴項。

在封面下,ivy:retrieve任務實際上也觸發了ivy:resolve。當發生ivy:resolve時,會將文件寫入本地常青藤緩存(位於user.home.ivy文件夾中),該文件指定了解析的方式(需要哪些修訂才能完成解析。)遇到ivy:publish時解析記錄從緩存中檢索並用於爲您的工件生成ivy.xml。

我在做這件事時發現的最大缺陷是ivy:resolveivy:publish任務在被ant執行時都被相同的類加載器加載。確保發生這種情況的最簡單方法是在taskdef任務上使用loaderRef。例如(注意匹配的loaderRef標籤):

<taskdef name="ivy-retrieve" 
    classname="org.apache.ivy.ant.IvyRetrieve" 
    classpathref="ivy.lib" 
    loaderRef="ivy.loader"/> 
<taskdef name="ivy-publish" 
    classname="org.apache.ivy.ant.IvyPublish" 
    classpathref="ivy.lib" 
    loaderRef="ivy.loader"/> 
4

首先你需要一個ivy.xml文件。在的ivy.xml

<ivy-module version="2.0"> 
    <info organisation="com.example.code" module="MyProject" 
     revision="${project.revision}"/> 
    <configurations> 
     <conf name="runtime" description="" /> 
     ... other config elements here... 
    </configurations> 

    <publications defaultconf="runtime"> 
     <artifact name="MyProject" type="jar" ext="jar" conf="runtime" /> 
    </publications> 

    <dependencies> 
     ... 
    </dependencies> 
</ivy-module> 

的信息元素和出版物元素讓你 跳過對build.xml中的常春藤元素的各種屬性。

請注意ivy.xml中的$ {project.revision}。該屬性在build.xml中的值爲 ,但這似乎很好地工作。然後修改可以很容易地具有任何所需的值(例如,夜間構建與本地構建)。

這裏是一個示例如何你可以設置你的build.xml文件

<property name="project.revision" value="1.0.0"/> 

... 

<target name="ivy"> 
    <ivy:resolve /> 

    <!-- Possible ivy:report, ivy:retrieve and other 
    elements for managing your dependencies go here --> 

    <ivy:deliver conf="*(public)"/> 
</target> 

<target name="publish" depends="clean, ivy, jar"> 
    <ivy:publish resolver="local"> 
     <!-- possible artifacts elements if your artifacts 
     are not in standard location --> 
    </ivy:publish> 
</target> 

... 
+0

很好的參考http://draconianoverlord.com/2010/07/18/publishing-to-maven-repos-with-ivy.html – 2012-01-13 18:09:18

2

你想先運行<ivy:deliver/>任務。這將創建一個可供Ivy存儲庫使用的ivy.xml文件。

當您使用<ivy:publish>時,您可以通過在resolver參數中指定要發佈的存儲庫來指定它。這需要與您的ivy.settings.xml文件中的解析器名稱相匹配。

您並沒有真正指定工件,而是找到要發佈的工件的模式。您可以通過<ivy:publish>任務中的<artifacts>子任務指定此項。例如,如果你建立了${basedir}/target/archive目錄下的一切都像我們這樣做,你可以將它指定爲這樣:

<ivy:publish resolver="public"> 
    <artifacts path="target/archive/[artifact].[ext]"/> 
</ivy:publish> 

如果你想改變你的文件的版本號,你可以使用的pubrevision參數<ivy:publish>任務。這不會更新ivy.xml,但將發佈您的罐子/戰爭到正確的修訂。我更喜歡使用<ivy:deliver>任務的參數pubrevision,並讓它創建正確的ivy.xml文件。然後,<ivy:publish>將使用我的ivy.xml文件中的修訂版。

你不需要做<ivy:retrieve>。畢竟,你正在運行一個構建來創建新的罐子,並且他們應該在你的構建中成爲SOMEWHERE。否則,如果你沒有創建jar或war,你想要發佈到你的常青藤資源庫中?而且,您當然不想檢索您的常青藤資源庫中的某些內容,只是爲了重新發布它。


我的理念一直是發佈是CM任務,不應該作爲構建過程的一部分來完成。因此,我們不使用<ivy:deliver><ivy:publish>

我們使用Artifactory作爲常青藤資源庫(以及我們的Maven資源庫)。我們使用Jenkins作爲我們的連續構建服務器。

我所做的是讓開發人員通過<ivy:makepom>任務將pom.xml文件從ivy.xml文件中取出。這個和生成的罐子/戰爭在Jenkins中被保存爲已存檔的工件。

當我們對特定構建感到滿意並希望在我們的公共存儲庫中使用時,我使用Jenkin的Promote Build任務來將其特定jar/war與其pom.xml一起提交到我們的Artifactory存儲庫。我們使用mvn deploy:deploy-file任務來做到這一點。