Я использую инструмент командной строки zip в OS X для сжатия папки проекта Xcode.
В эту папку включен .framework для OS X, который включает символические ссылки, например, xx.framework/Versions/Current
which указывает на xx.framework/Versions/A
. Когда я архивирую проект, а затем распаковываю его, Versions/A и Versions/Current содержат один и тот же набор файлов — по сути, они содержатся в архиве дважды — мне нужно этого избежать.
Однако у меня также есть символические ссылки в папке проекта, указывающие на файлы ресурсов, которые нужно скопировать в zip-архив. Поэтому я не могу просто использовать глобальные флаги zip для хранения символических ссылок вместо файлов/каталогов, на которые они указывают.
Как создать один ZIP-файл, в котором будут храниться только определенные символические ссылки, а в других будет храниться содержимое, на которое они указывают?
Возможно ли это вообще с zip? Есть ли другой совместимый с zip инструмент, который я мог бы использовать? Могу ли я запустить команду zip несколько раз, исключая/включая определенные файлы, сохраняя файлы в тот же архив, чтобы добиться того, чего я хочу?
PS: Я не могу иметь zip внутри zip. После распаковки проект должен быть пригоден для использования и не требовать распаковки содержащегося zip.
Что я пробовал:
zip -rq4y $ZIPFILE $TARGETFOLDER/xx.framework
zip -rq4u $ZIPFILE $TARGETFOLDER
Идея была в том, чтобы сначала заархивировать .framework, сохранив символические ссылки. Затем обновить архив, чтобы добавить остальные файлы, включая любые файлы/папки, на которые указывают символические ссылки, которых еще нет в архиве (или я на это надеялся). Результат: поврежденный архив (Ошибка 20 — Не каталог).
Я также попробовал сделать наоборот, исключив фреймворк при первом проходе, а затем обновив архив с фреймворком:
zip -rq4 $ZIPFILE $TARGETFOLDER -x xx.framework
zip -rq4uy $ZIPFILE $TARGETFOLDER
Результат: поврежденный архив (Ошибка 21 — Является каталогом).
решение1
Попался!
Одна из проблем заключалась в том, что я использовал неправильный формат исключения. С начальной и конечной звездочками это решение работает:
zip -rq4 $ZIPFILE $TARGETFOLDER -x *xx.framework*
zip -rq4uy $ZIPFILE $TARGETFOLDER -i *xx.framework*
Поэтому сначала он архивирует папку, за исключением фреймворка, копируя все связанные файлы/папки в архив.
Вторая строка обновляет архив с y
флагом (хранить символические ссылки, а не файлы/папки, на которые они указывают). Я явно включаю только папку фреймворка, это может быть не обязательно, но я думаю, что это чище и, возможно, быстрее.