2015-03-26 3 views
0

У меня есть исходный каталог, содержащий некоторые обновления файлов, которые мне нужно скопировать в каталог моего веб-приложения. Прежде чем копировать файлы на место, мне нужно сделать резервную копию каждого оригинала, который будет переписан в резервную копию. Я не могу создать резервную копию всего веб-приложения в резервном месте, так как это будет 00 файлов. Мне нужно сохранить структуру дирижабля (без сплющивания) & все 3 местоположения имеют одинаковую структуру.Файлы резервных копий Ant до копирования

Моя настоящая идея - сделать это в 2 этапа. Затем резервное копирование обновится. Обновление тривиально (скопируйте набор файлов &). Резервное копирование вызывает проблемы, поскольку я только хочу создать резервную копию файлов, которые будут обновляться.

Ниже приведена моя текущая итерация (которая не работает) ... Используйте копию с todir в качестве места для резервного копирования, а затем установите набор файлов, который ищет исходные файлы, поэтому у меня есть набор сменных файлов. Очевидно, что мне нужно изменить пути файлов, возвращаемых набором файлов, чтобы они ссылались на существующие файлы, а не на новые &, где я застрял. Кто-нибудь знает, как изменить пути файлов, возвращаемых набором файлов? Я использую pathconvert ниже, который, как я знаю, ошибочен, но я оставил его, чтобы показать преобразование, которое мне нужно - кто-нибудь знает, как это сделать? Или лучший способ, может быть!

${backup.dir} --> root of file backup 
${console.war} --> location of existing files - the top of the application dir 
${update.dir} --> root of updated files 

<copy todir="${backup.dir}/app/console.war"> 
    <fileset dir="${update.dir}/app/console.war" includes="**" id="id.update.files"/> 
    <pathconvert refid="id.update.files" property="custom.file.target"> 
     <map from="${update.dir}/app/console.war" to="${console.war}"/> 
    </pathconvert> 
</copy> 
+0

Может быть, вы должны использовать такой инструмент, как Rsync, который предназначен для синхронизации файлов и делать резервные копии. Если вы все еще хотите, чтобы все было проверено в сценарии Ant, вы можете просто использовать задачу 'exec' для вызова rsync для выполнения резервных копий перед копированием по обновленным файлам. Если вы отрицательно относитесь к использованию rsync, посмотрите на задачу 'sync' для выполнения резервного копирования перед выполнением обновления. – ewh

ответ

0

Работала в конце. Придется использовать для ant-contrib, но это нормально для этого сайта. Ключ использовался с и с этого момента на моем путиконверт был в порядке. Ниже приведен рабочий код для справки - я уверен, что он может быть более резким, но он работает.

<for param="source.filename"> 
     <path> 
      <fileset dir="${update.dir}" id="id.src.files"> 
       <include name="**"/> 
      </fileset> 
     </path> 

     <sequential> 
      <!-- using the source.filename, build the target.filename --> 
      <local name="target.filename"/> 
      <local name="target.dirname"/> 
      <pathconvert property="target.filename"> 
       <file file="@{source.filename}" /> 
       <map from="${update.dir}" to="${console.war}" /> 
      </pathconvert>    
      <dirname property="target.dirname" file="${target.filename}"/> 

      <!-- using the source filename build the backup filename --> 
      <local name="backup.filename"/> 
      <pathconvert property="backup.filename"> 
       <file file="@{source.filename}" /> 
       <map from="${update.dir}" to="${backup.dir}" /> 
      </pathconvert>    

      <if> 
       <available file="${target.filename}"/> 
       <then> 
        <copy tofile="${backup.filename}"> 
         <filelist dir="${target.dirname}"> 
          <file name="${target.filename}"/> 
         </filelist> 
        </copy> 
       </then> 
      </if> 
      <copy file="@{source.filename}" tofile="${target.filename}"/> 
      <echo message=""/> 

     </sequential> 
    </for> 
0

Вы можете попробовать следующее:

<copy todir="${backup.dir}/app/console.war"> 
    <fileset dir="${console.war}"> 
    <and> 
     <different targetdir="${update.dir}/app/console.war" 
      ignorecontents="true" ignorefiletimes="false"/> 
     <not> 
     <depend targetdir="${update.dir}/app/console.war"/> 
     </not> 
    </and> 
    </fileset> 
</copy> 

Здесь and, different, not и depend являются selectors. Вышеупомянутый код выбирает эти файлы из fileset, которые отличаются от соответствующими файлами в каталоге обновлений (относительно размера и времени изменения файла), кроме тех, которые новее, чем , их соответствующие файлы в каталоге обновлений.

(Существует тонкое различие между тем, как приведенный выше код определяет какие файлы устарели и как задача копирования делает это по умолчанию, , но только для соответствующих файлов с тем же временем модификации еще разных длин файлов.)

следующий код может быть использован для создания автономного примера build.xml попробовать приведенный выше код:

<project name="backup"> 

    <property name="backup.dir" value="backup.dir"/> 
    <property name="update.dir" value="update.dir"/> 
    <property name="console.war" value="console.war"/> 

    <delete dir="${backup.dir}/app/console.war"/> 
    <delete dir="${update.dir}/app/console.war"/> 
    <delete dir="${console.war}"/> 
    <mkdir dir="${backup.dir}/app/console.war"/> 
    <mkdir dir="${update.dir}/app/console.war"/> 
    <mkdir dir="${console.war}"/> 

    <touch datetime="03/27/2015 09:00 AM" file="${update.dir}/app/console.war/aaa"/> 
    <touch datetime="03/27/2015 09:11 AM" file="${update.dir}/app/console.war/bbb"/> 
    <touch datetime="03/27/2015 09:11 AM" file="${console.war}/aaa"/> 
    <touch datetime="03/27/2015 09:11 AM" file="${console.war}/bbb"/> 
    <touch datetime="03/21/2015 09:11 AM" file="${console.war}/ccc"/> 
    <touch datetime="03/27/2015 09:22 AM" file="${update.dir}/app/console.war/ccc"/> 
    <touch datetime="03/27/2015 09:22 AM" file="${update.dir}/app/console.war/ddd"/> 

    <!-- insert above copy task --> 

</project> 

Проверьте содержимое созданного backup.dir (файл ccc). (остальные файлы игнорируются, поскольку aaa новее, bbb такой же возраст и ddd еще не существует. Только ccc устарело.)