2015-09-03 3 views
0

Je suis en train d'écrire un remplacement de la tâche <zip> intégrée afin qu'il prend en charge les mots de passe en utilisant <exec> et 7za.exe. L'idée est d'avoir un remplacement direct de la tâche <zip>.Existe-t-il un moyen commun d'accéder à l'ensemble de fichiers résultant d'une tâche ANT?

La difficulté est que <zip> soutien tant de façons de déclarer les fichiers à inclure/exclure tels que:

  • includes
  • includesfile
  • excludes
  • excludesfile
  • defaultexcludes
  • et imbriquées <fileset> déclarations

Y at-il un moyen d'utiliser le résultat de ces fileset instructions dans la tâche exec?

Répondre

0

Basé sur le answer j'ai été en mesure de trouver une solution qui fonctionne de manière similaire à la tâche <zip> intégrée. En utilisant <pathconvert> et des guillemets simples fait l'affaire:

<macrodef name="sevenzip" description="Command line interface for 7zip"> 
    <attribute name="level" default="5"/> <!-- will be ignored for now, just to make it compatible with normal ZIP task --> 
    <attribute name="basedir"/> 
    <attribute name="excludes" default=""/> 
    <attribute name="includes" default="**/**"/> 
    <attribute name="destfile"/> 
    <attribute name="password" default=""/> 

    <sequential> 
     <description>7-Zip integration</description> 
     <local name="passArg" /> 
     <if> 
      <equals arg1="@{password}" arg2=""/> 
      <then> 
       <property name="passArg" value="" /> 
      </then> 
      <else> 
       <!-- p<SECRET> = set password of archive --> 
       <property name="passArg" value='"[email protected]{password}"' /> 
      </else> 
     </if> 

     <fileset id="mask" dir="@{basedir}"> 
      <include name="@{includes}" /> 
      <exclude name="@{excludes}" /> 
     </fileset> 

     <local name="mask" /> 
     <pathconvert property="mask" refid="mask" pathsep="' '" /> 
     <!-- the single quotes help to wrap file names containing spaces --> 

     <exec executable="${7zip.cmd}" failonerror="true"> 
      <!-- command --> 
      <arg value="a"/>    <!-- a : add files to archive --> 
      <!-- arg value="u"/ -->    <!-- u : update files to archive --> 

      <!-- switches --> 
      <arg value="-bd"/>    <!-- -bd : disable percentage indicator --> 
      <arg value="-tzip"/>   <!-- -t<type> : set type of archive -->    

      <arg value="${passArg}"/>  

      <arg value="--"/>    <!-- : Stop switches parsing --> 

      <!-- archive file --> 
      <arg value="@{destfile}"/> 

      <!-- file names/wildcards --> 
      <arg line="'${mask}'"/> 
      <!-- 
       the single quotes are the outter wrapper for the single quotes 
       from pathconvert, the line attribute add the result to the arguments 
       but NOT as a single escaped string 
      --> 

     </exec> 
    </sequential> 
</macrodef> 
0

La propriété non documentée ${toString:filesetid} possède tous les fichiers, séparateur par défaut est « ; ».
Pour convertir le séparateur utiliser pathconvert task, la propriété résultante contiendra les fichiers avec le séparateur choisi, f.e. :

<fileset dir="C:/diff1" includes="**/*.html" id="diff"> 
<different targetdir="C:/diff2" 
    ignoreFileTimes="true"/> 
</fileset> 

<!-- one file one line --> 
<pathconvert refid="diff" pathsep="${line.separator}" property="htmldiff"/> 

<!-- blank as separator --> 
<pathconvert refid="diff" pathsep=" " property="htmldiff"/> 

<echo file="C:/diff1/htmldiff.txt">${htmldiff}</echo> 

pour une utilisation dans exec avec la ligne de arg, en blanc comme séparateur semble correspond le.

+0

Merci pour la réponse. Ma solution est quelque chose dans ce sens. – ViToni