LINUX.ORG.RU

ANT + build.xml. как создать zip-архивы?


0

0

задача - заархивировать каждый каталог с именем, начинающимся на 'com_' из корня проекта, в отдельный zip архив.

для конкретного каталога /project/com_1, в build.xml написал так:

<target name="dist" description="build zip archive" depends="build"> <zip includes="com_1/*" destfile="${dist.components.dir}/com_1.zip" basedir="."/> </target>

как теперь это распространить для общего случая?

зы: проект на php, просто пишем в eclipse.

anonymous

гмм, про ant не знаю, но в nant есть: <foreach item="Folder" in="${FolderName}" property="foldername"> и <foreach item="File" in="${FolderName}" property="filename">

Amenich
()
Ответ на: комментарий от Kpoxman

ок. как написать правило для SCons'а: "заархивировать Zip'ом содержимое директории components/com_1, так чтобы базовой директорией в архиве была com_1" ?

anonymous
()
Ответ на: комментарий от anonymous

с базовой директорией есть проблемы, согласен :)
однако, то как эту проблему решают в приведенной ссылке это мрак.

предлагаю примерно так (запускать не пробовал, но до ума довести можно):

def tar_generator(source, target, env, for_signature):
    pre = ''
    for i in range(0, str(env['BASEDIR']).count('/')):
        pre += '../'
    srcdefs = ''
    for i in source:
        srcdefs += ' ' + pre + str(i)
    return 'cd $BASEDIR && ' + 'tar -cf ' + pre + '$TARGET' + srcdefs

tar_builder = Builder(generator = tar_generator, emitter = tar_emitter)
env.Append(BUILDERS = {'MyTar' : tar_builder})

а применять это так:

env.MyTar('distrib/myarchieve.tar', ['basedir/somedir1/file1', 'basedir/somedir1/file2'], BASEDIR = 'basedir')

создастся архив, в котором будет
somedir1/file1
somedir1/file2
а basedir присутствовать не будет.

Kpoxman ★★
()
Ответ на: комментарий от Kpoxman

в принципе у tar есть ключик -C . а мне нужен zip. но идеалогия примено ясна. спасибо за мысль.

тогда вот еще:

1. как в SCons'е отследить изменения файлов? (если какие-то файлы в директории com_1 изменились с момента последней сборки проекта (запуска scons'а) -- обновить их в архиве, иначе архив не трогать).

2. в файле сборки есть цели (dist) "собрать архив" и (deploy) "залить архив на сервер". как сделать так, чтобы цель (deploy) выполнялась только в том случае, если цель (dist) обновила архив?

зы: первая фича в ANT'е встроена. вторая - решается зависимостями.

anonymous
()
Ответ на: комментарий от anonymous

1) когда мы пишем правило, например
env.Program(target, sources)
то автоматически target становится зависим от списка sources. причем это работает не только для встроенных методов типа Program и Library, но и для нашего MyTar это будет выполняться.

2) можно в билдере, где у нас делается 'cd .... && tar ...'
дописать ' && ncftpput ......'.
это выглядит как-то через ж. сходу не могу сказать, как это сделать правильно. связано это с тем, что SCons гарантирует консистентность целей. а выполнять деплой в случае, если архив обновился - это не гарантия. т.к., н-р архива может там вообще не быть, и т.д.


Kpoxman ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.