Как добавить снимок и проверить варианты в свой ivy.xml - PullRequest
1 голос
/ 10 июня 2010

Я использую ant + ivy + nexus для сборки и публикации моих java OSGi проектов (просто старые добрые jar, если вы не знакомы с OSGi). После обычного периода плавления ума, который возникает при использовании новых технологий, у меня появляется в основном функциональная система. Но теперь у меня есть два измерения вариации артефакта: снимок / выпуск и основной / тест.

Основное / тестовое измерение говорит само за себя. Снимок / выпуск важен для публикации в Nexus удобным для пользователя способом. (Чрезвычайно полезен для интеграции с OSGi с открытым исходным кодом). Итак, у меня есть следующие артефакты для каждого проекта, и у меня много много проектов:

  • project-revision.xml (bp)
  • project-test-revision.xml (b)
  • project-revision-SNAPSHOT.xml (bp)
  • project-test-revision-SNAPSHOT.xml (b)

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 с украшенными именами из одного файла ivy, не могли бы вы опубликовать фрагменты конфигурации, которые достигают этого? Было бы чрезвычайно полезно. (Не забывайте, что maven не будет знать о конфигурациях, поэтому мне нужно получить изменения в имени файла и pom).

Большое спасибо

Алистер

1 Ответ

1 голос
/ 10 июня 2010

Хорошо, обновление: у меня теперь есть публикация артефакта. Я немного боролся, пока у меня был тестовый конф, расширяющий стандартную конф. Во время публикации я получал жалобу на то, что отсутствовали артефакты конфигурации по умолчанию ... что меня не волнует, только публикуя тестовый пример. Делая их независимыми, но частично совпадающими, я получаю полный контроль над тем, что публиковать.

НО !!!!! Там нет жизнеспособных тестовых 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> 
...