Pergunta

Eu tenho um projeto Ant existente e gostaria de acelerar o processo de construção evitando componentes construção de re-que já estão atualizados.

Ant permite que você especifique que um alvo depende de outro, mas por padrão a cada pré-requisito é sempre reconstruído, mesmo se ele já é de até encontro. (Esta é uma diferença fundamental entre Ant e make. Por padrão, o make única re-constrói um alvo quando necessário - isto é, se algum pré-requisito é mais novo).

<uptodate property="mytarget.uptodate">  // in set.mytarget.uptodate task
  ...
</uptodate>
<!-- The prerequisites are executed before the "unless" is checked. -->
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate">
  ...
</target>

Para fazer Ant pré-requisitos Recuperado somente se necessário, parece haver dois geral abordagens dentro Ant.

A primeira abordagem é usar a tarefa uptodate para definir uma propriedade. Então, sua tarefa pode testar a propriedade e construir apenas se a propriedade é (não) set.

<uptodate property="mytarget.uptodate">  // in set.mytarget.uptodate task
  ...
</uptodate>
<!-- The prerequisites are executed before the "unless" is checked. -->
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate">
  ...
</target>

Uma primeira abordagem alternativa é usar a tarefa outofdate de contrib formiga. É mais agradável na medida em que é apenas um alvo, sem um ser propriedade separada definiram; pelo contrário, outofdate requer alvos separados para acertar e testar a propriedade.

A segunda abordagem é criar um <fileset> usando o <modified> selector. Ele calcula hashes MD5 para arquivos de arquivos e seleciona cujos MD5 difere de valores anteriormente armazenados. É opcional para set

 <param name="cache.cachefile"     value="cache.properties"/>

dentro do seletor; o padrão é "cache.properties". Aqui está um exemplo que copia todos os arquivos de src para dest cujo conteúdo tem alterado:

    <copy todir="dest">
        <fileset dir="src">
            <modified/>
        </fileset>
    </copy>

Nenhum destes é muito satisfatório, uma vez que me obriga a escrever Ant código para um processo (evitando re-construção) que deve ser automático.

Há também Ivy, mas não posso dizer de sua documentação se fornece esse recurso. O caso de uso de chave na documentação Ivy parece estar baixando subprojetos a partir da Internet em vez de evitar desperdício trabalho, encenando as partes de um único projeto. Maven fornece semelhante funcionalidade, com o mesmo caso de uso em destaque na sua documentação. (Mover um projecto não-trivila existente para Maven é dito ser um pesadelo; por contraste, a partir do desenvolvimento de raiz com Maven é mais palatável.)

Existe uma maneira melhor?

Foi útil?

Solução

Esta compilação condicional de uma grande construção é uma característica da make que eu initally perdeu em ANT . Ao invés de dependências alvo uso, eu sugiro dividindo seu projeto grande em módulos menores, cada publicação para um comum compartilhada repositório.

Ivy pode então ser usado para controlar as versões dos componentes utilizados pelo módulo principal do projeto.

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="multi_module_project"/>
    <publications>
        <artifact name="main" type="jar"/>
    </publications>
    <dependencies>
        <dependency org="com.myspotontheweb" name="component1" rev="latest.integration"/>
        <dependency org="com.myspotontheweb" name="component2" rev="latest.integration"/>
        <dependency org="com.myspotontheweb" name="component3" rev="latest.integration"/>
        <dependency org="com.myspotontheweb" name="component4" rev="latest.integration"/>
    </dependencies>
</ivy-module>

O ivy: recuperar tarefa exibirá somente a download / copiar um dos sub-módulos se eles mudaram (publicado a partir de seus arquivos de compilação)

Tudo soa mais complicado, mas talvez você está já sub-dividindo o projeto dentro do seu arquivo de construção .... Por exemplo, se o seu ANT uptodate tarefa está sendo feita dependente de uma compilação artefatos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top