Como a hera: publicar trabalhos?

votos
24

Estou completamente à perda como a formiga hera tarefa: publicar é suposto para trabalhar.

Eu esperaria que eu faço meu construir normal, o que cria um monte de arquivos jar, então eu iria empurrar os frascos para o repositório (local).

Como posso especificar de onde obter os jarros construídos, e como é que aqueles que acabam no repositório?

Atualizar:

<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>

isso realmente funciona, eu não incluí a recuperar antes.

Mas eu ainda tenho alguns problemas, suponha que eu quero publicar 3 frascos, openscada-utils.jar, openscada-utils-sources.jar e openscada-utils-javadocs.jar como openscada-utils-0.9.2.jar, openscada-utils -0.9.2-sources.jar e openscada-utils-0.9.2-javadocs.jar

Não está inteiramente claro para mim, como os nomes reais são montados, e onde posso especificar quais nomes devem começar. (Usando o fragmento acima, os frascos são sempre chamado somente utils.jar).

Update 1:

Eu tenho que trabalhar (um pouco), mas ainda não se sente bem. De alguma forma, todos os tutoriais se concentrar em dependências de projetos 3o partido, mas um ponto igualmente importante para mim é para lidar com dependências específicas do projeto.

Eu tenho um monte de sub projectos que dependem uns dos outros de várias maneiras. Considerando ivy: publicá-lo não é claro para mim como começar.

  1. Como posso lidar com a primeira versão? Eu tenho um número de versão comum para todos os subprojetos para indicar que eles pertencem um ao outro (digamos 0,9). Portanto, a primeira revisão deve ser 0.9.0, mas nada tão longe dos meus projetos é no meu repositório. Como faço para obter Ivy para atribuir esse número de revisão.

  2. No decurso do desenvolvimento Quero publicar os arquivos construídos de novo, sem alterar o número de revisão até agora.

  3. Se eu estou acabado com o meu trabalho eu quero empurrá-lo para um repositório compartilhado (e aumentar o número de revisão permite dizer que a partir de 0.9.0 para 0.9.1), que é a abordagem recomendada para fazer isso?

  4. Para um lançamento real, eu quero fazer distribuições com dependências e sem, de alguma forma, eu acho que eu posso usar diferentes configurações para isso. Como posso usar isso a meu favor?

Publicado 09/12/2008 em 17:18
fonte usuário
Em outras línguas...                            


4 respostas

votos
9

Você precisa especificar o "resolvedor". Algo como:

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

É controlado pelo padrão. Esta página cobre muito bem. Parece que você quer seu ser:

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

E você vai precisar para identificar os três frascos como artefatos no arquivo ivy.xml. Algo assim:

<publications>
    <artifact name="utils"/>
    <artifact name="utils" type="source"/>
    <artifact name="utils" type="javadocs"/>
</publications>
Respondeu 09/12/2008 em 17:30
fonte usuário

votos
4

Primeiro você precisa de um arquivo 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>

Os elementos de informações de elementos e publicações em ivy.xml permitir que você pule vários atributos sobre os elementos de hera em build.xml.

Observe o $ {project.revision} em ivy.xml. A propriedade está determinado valor em build.xml, mas isso parece funcionar bem. A revisão pode facilmente ter qualquer valor é necessário (por exemplo. Nightly builds vs. constrói local).

Aqui está uma amostra de como você pode configurar o arquivo 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>

...
Respondeu 13/01/2012 em 17:28
fonte usuário

votos
2

Você está supor para executar a <ivy:deliver/>tarefa em primeiro lugar. Isso cria um arquivo ivy.xml que pode ser usado pelo repositório Ivy.

Quando você usa <ivy:publish>você especificar qual repositório que você deseja publicar, especificando-a no resolverparâmetro. Isso precisa corresponder ao nome resolvedor em sua ivy.settings.xmlarquivo.

Você realmente não especificar os artefatos, mas um padrão onde encontrar os artefatos para publicar. Você especificar essa via a <artifacts>subtarefa na <ivy:publish>tarefa. Por exemplo, se você construir tudo sob o ${basedir}/target/archivediretório como nós fazemos, você pode especificá-lo como este:

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

Se você quiser alterar o número de revisão do seu arquivo, você pode usar o pubrevision parâmetro da <ivy:publish>tarefa. Esta não atualiza o ivy.xml, mas irá publicar seus frascos / guerras para a revisão correta. Eu prefiro usar o pubrevision parâmetro da <ivy:deliver>tarefa e deixá-lo criar o correto ivy.xmlarquivo de qualquer maneira. Em seguida, <ivy:publish>irá utilizar a revisão no meu ivy.xmlarquivo.

Você não precisa fazer <ivy:retrieve>. Afinal, você está executando uma compilação para criar novos frascos, e eles devem estar em algum lugar em sua construção. Caso contrário, se você não está criando um frasco ou a guerra que você está tentando publicar em seu repositório Ivy? E, você certamente não deseja recuperar algo já em seu repositório Ivy apenas para republicá-lo.


Minha filosofia sempre foi que a publicação é uma tarefa CM e não deve ser feito como parte do processo de construção. Assim, nós não usamos <ivy:deliver>ou <ivy:publish>.

Usamos Artifactory como nosso repositório Ivy (e nosso repositório Maven). Usamos Jenkins como o nosso servidor de compilação contínua.

O que eu faço é que os desenvolvedores fazer um pom.xmlarquivo fora do seu ivy.xmlarquivo através da <ivy:makepom>tarefa. Este e os frascos de compilação / guerras são salvos como artefatos arquivados em Jenkins.

Quando estamos felizes com uma construção particular e deseja-lo em nosso repositório público, eu uso Jenkin do Promover a tarefa de compilação para promover um determinado frasco / guerra com seu pom.xml para o nosso repositório Artifactory. Usamos a mvn deploy:deploy-filetarefa de fazer isso.

Respondeu 28/08/2012 em 19:07
fonte usuário

votos
0

É importante perceber o que hera está fazendo aqui. Não é simplesmente copiar seus frascos de artefato no repositório ivy - também está a gerar os arquivos relevantes ".ivy.xml" que especificam todos os dependentes de cada um de seus artefatos.

Debaixo das cobertas, a ivy:retrievetarefa é, na verdade também desencadeando uma ivy:resolve. Quando isso ivy: determinação ocorre, um arquivo é escrito para o cache hera local (na .ivypasta user.home) que especifica como a resolução aconteceu (. Que revisões de quais módulos foram necessários para concluir a resolução) Quando ivy:publishfor encontrado, esse registro resolução é recuperado de cache e usado para gerar o ivy.xml para seus artefatos.

A maior armadilha que eu encontrei para fazer isso é a exigência de que o ivy:resolvee ivy:publishtarefas tanto ser carregado pelo mesmo carregador de classe quando eles são executados por formigas. A maneira mais fácil para se certificar de que isso acontece é usar o loaderRef em suas tarefas taskdef. Por exemplo (observe as tags loaderRef correspondência):

<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"/>
Respondeu 10/12/2008 em 07:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more