我正在使用ant + ivy + nexus来构建和发布我的java OSGi项目(如果你不熟悉OSGi,那就是好老罐子)。在通常的精神融化时期之后,当我接触到新技术时,我就拥有了一个功能最强大的系统。但是,我现在有两个工件变体维度:快照/发布和主/测试。
主要/测试维度真的说明了一切。快照/发布对于以友好的方式发布到nexus至关重要。 (对于与开源OSGi运行时集成非常有用)。所以,我在每个项目的基础上有以下工件,我有很多项目:
b =成功建造 p =成功发布 (我还没有正确发布测试内容)
我花了一段时间才能在我的构建脚本中到处都没有重复代码,但是我已经设法了......有一个很大的警告。对于SNAPSHOT分支,我在所有修订中附加“-SNAPSHOT”。在蚂蚁中,我设法以编程方式实现这一点,但对于常春藤,我使用的是重复的ivy.xml;常春藤SNAPSHOT.xml。这有
<info ... revision="x.x-SNAPSHOT">
注意-SNAPSHOT。没有这个,我永远无法得到我的
<ivy:deliver>
<ivy:resolve>
<ivy:publish>
正确发布工件和maven pom的命令链。 (请记住,我有一个要求让这个maven友好...如果我真的最终使用maven来构建它,我会被诅咒!)
现在我不得不介绍测试/主要维度。我理想的是要发布
project-test-revision(-SNAPSHOT).jar
(注意可选快照)。我真的不想通过指定
来做到这一点<info ... module="project-test" ... >
而不是另一个常春藤文件中的<info ... module="project" ... >
。如果我走这条路(就像我已经开始的那样),那么我最终会得到大量的ivy-Option1-Option2 ......- OptionN.xml文件。每个新的双值变化使构建和常春藤文件的数量翻倍。那是废话。必须有一个更好的方法。我找不到它。
如果您已成功通过一个常春藤文件中的装饰名称获取ivy发布工件,您是否介意发布实现此目的的配置片段?会非常有用。 (不要忘记maven不会知道配置,所以我需要知道文件名和pom的变化。)
非常感谢
阿拉斯泰尔
答案 0 :(得分:1)
好的,更新:我现在已经发布了工件。我挣扎了一会儿,我让测试配置扩展了默认配置。我在发布期间得到一个投诉,默认的配置工件不存在......我只是在发布测试用例时并不关心。通过使它们独立但重叠,我得到了对发布内容的精细控制。
BUT !!!!!没有可行的测试pom - 那还没有发布。嗯,实际上它确实发布了,但它包含非测试用例的数据。所以这仍然不是友好的。如果有人对此有任何建议那就太棒了。
无论哪种方式,我正在使用的代码,以防它也帮助你:
的ivy.xml:
<info
organisation="MY_ORGANISATION"
module="MY_PROJECT"
status="integration"
revision="1.0-SNAPSHOT">
</info>
<configurations>
<conf name="default" description="Default compilation configuration; main classes only" visibility="public"/>
<conf name="test" description="Test-inclusive compilation configuration. Don't forget to also add Default compilation configuration where needed. This does not extend default conf" visibility="public"/>
</configurations>
<publications>
<artifact name="MY_PROJECT type="jar" ext="jar" conf="default"/>
<artifact name="MY_PROJECT type="pom" ext="pom" conf="default"/>
<artifact name="MY_PROJECT-test" type="jar" ext="jar" conf="test"/>
<artifact name="MY_PROJECT-test" type="pom" ext="pom" conf="test"/>
</publications>
<dependencies>
<dependency org="MY_ORGANISATION" name="ANOTHER_PROJECT" rev="1.0-SNAPSHOT" transitive="true" conf="*"/>
<dependency org="junit" name="junit" rev="[4,)" transitive="true" conf="test->*"/>
</dependencies>
的build.xml:
<property name="project.generated.ivy.file" value="SNAPSHOT_OR_RELEASE_IVY_XML_FILE" />
<property name="ivy.publish.status" value="RELEASE_OR_INTEGRATION" />
<property name="project.qualifier" value="-SNAPSHOT_OR_EMPTY" />
<property name="ivy.configuration" value="DEFAULT_OR_TEST" />
<target name="publish" depends="init-publish">
<ivy:deliver
deliverpattern="${project.generated.ivy.file}"
organisation="${project.organisation}"
module="${project.artifact}"
status="${ivy.publish.status}"
revision="${project.revision}${project.qualifier}"
pubrevision="${project.revision}${project.qualifier}"
conf="${ivy.configuration}"
/>
<ivy:resolve conf="${ivy.configuration}" />
<ivy:makepom
ivyfile="${project.generated.ivy.file}"
pomfile="${project.pom.file}"
/>
<ivy:publish
resolver="${ivy.omnicache.publisher}"
module="${project.artifact}"
organisation="${project.organisation}"
revision="${project.revision}${project.qualifier}"
pubrevision="${project.revision}${project.qualifier}"
pubdate="now"
overwrite="true"
publishivy="true"
status="${ivy.publish.status}"
artifactspattern="${project.artifact.dir}/[artifact]-[revision](-[classifier]).[ext]"
conf="${ivy.configuration}"
/>
</target>