2010-06-10 16 views
1

J'utilise ant + ivy + nexus pour construire et publier mes projets java OSGi (juste de bons vieux jars si vous n'êtes pas familier avec OSGi). Après la période de réflexion habituelle que l'on a avec une nouvelle technologie, j'ai un système essentiellement fonctionnel. Mais, j'ai maintenant deux dimensions de la variation d'artefact: snapshot/release et main/test.Comment puis-je ajouter des variations Snapshot et test à mon ivy.xml

La dimension principale/test parle vraiment d'elle-même. L'instantané/la publication est essentiel pour publier dans Nexus d'une manière conviviale. (Extrêmement utile pour l'intégration avec les runtimes OSGi open-source). Alors, je les artefacts suivants sur une base par projet, et j'ai beaucoup de projets:

  • projet revision.xml (pb)
  • projet-test revision.xml (b)
  • projet révision-SNAPSHOT.xml (pb)
  • projet-test-révision-SNAPSHOT.xml (b)

b = construire avec succès p = publication (je ne l'ai pas encore avec succès obtenu la tester des choses corr ectly)

Cela m'a pris du temps pour aller aussi loin sans dupliquer le code partout dans mes scripts de construction, mais je l'ai réussi ... avec une grosse mise en garde. Pour la branche SNAPSHOT, j'ajoute "-SNAPSHOT" à toutes les révisions. Dans la fourmi je parviens à réaliser ceci par programme, mais pour le lierre j'emploie un ivy.xml dupliqué; ivy-SNAPSHOT.xml. Cela a

<info ... revision="x.x-SNAPSHOT"> 

Notez le-SNAPSHOT. Sans cela, je ne pourrais jamais obtenir ma chaîne de commandes pour publier correctement artefact et maven pom. (Rappelez-vous que j'ai une exigence pour rendre ce maven convivial ... Je serai damné si je finis par utiliser maven pour construire l'esprit!)

Maintenant, je suis coincé en introduisant la dimension test/main. Je cherche idéalement à publier

project-test-revision(-SNAPSHOT).jar 

(Notez l'instantané optionnel). Je ne veux vraiment pas faire cela en spécifiant

<info ... module="project-test" ... > 

par opposition à <info ... module="project" ... > dans un autre fichier de lierre. Si je suis allé sur cette route (comme j'ai déjà commencé) alors je me retrouve avec des tas de fichiers ivy-Option1-Option2 ...- OptionN.xml. Avec chaque nouvelle variation de deux valeurs doublant le nombre de fichiers build et ivy. Ce n'est pas bon. Il doit y avoir un meilleur moyen. Je ne peux pas le trouver.

Si vous avez réussi à obtenir des artefacts de publication lierre avec des noms embellis à partir d'un fichier ivy, cela vous dérangerait-il de publier les extraits de configuration qui y parviennent? Serait extrêmement utile. (N'oubliez pas que maven ne connaîtra pas les configurations, j'ai donc besoin d'obtenir les variations dans le nom de fichier et pom).

Un grand merci

Alastair

Répondre

1

Ok, mise à jour: J'ai maintenant la publication d'artefact. J'ai lutté un peu pendant que j'avais le test conf prolongeant la configuration par défaut. Je recevrais une plainte lors de la publication que les artefacts de configuration par défaut n'étaient pas présents ...quelque chose dont je ne me soucie pas tout en publiant seulement le cas de test. En les rendant indépendants mais qui se chevauchent, je récupère un contrôle précis de ce qu'il faut publier.

MAIS !!!!! Il n'y a pas de test viable - ce n'est pas encore publié. Eh bien, en fait, il publie, mais il contient des données pour le cas non-test. Donc ce n'est toujours pas convivial. Si quelqu'un a des suggestions à ce sujet, ce serait génial.

De toute façon, le code que je suis maintenant à l'aide, au cas où il vous aide aussi:

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>