Почему .pkg файл перемещает мои файлы, если в нем отсутствуют скрипты?

Я постепенно изучаю процесс создания .pkg-файлов в macOS и наткнулся на странную особенность, связанную с использованием этих файлов. После установки пакета файлы, указанные в качестве содержимого, перемещаются из исходной папки. 

Для подробностей: я создаю пакет с помощью pkgbuild или productbuild, используя аргумент --root для указания папки с файлами, которые я хочу упаковать. Вот команда, которую я использую:

<pre><code>pkgbuild --identifier com.example.anything --root FolderWithFiles --install-location /tmp/other/folder/again test.pkg</code></pre>

или 

<pre><code>productbuild --identifier com.example.anything --root FolderWithFiles /tmp/other/folder/again test.pkg</code></pre>

После выполнения любой из этих команд создается файл test.pkg. Затем, когда я запускаю этот test.pkg, нажимаю кнопки "Далее", вводю свой пароль и получаю сообщение о успешной установке.

Однако я замечаю странное поведение: файлы из папки, указанной в аргументе --root (т.е. из папки "FolderWithFiles"), перемещаются в папку назначения, указанную при установке, а именно в /tmp/other/folder/again. Например, если в "FolderWithFiles" находилось приложение "MyBestCalculator.app", то после установки test.pkg эта папка оказывается пустой, а "MyBestCalculator.app" появляется в "/tmp/other/folder/again". 

Если я перемещу "MyBestCalculator.app" с этой папки на рабочий стол (в ~/Desktop) и снова запущу test.pkg, то после установки  "MyBestCalculator.app" исчезнет с рабочего стола, но вновь окажется в "/tmp/other/folder/again".

Что происходит? В чем причина такого поведения?
  • 8 декабря 2024 г. 22:33
Ответы на вопрос 2
Такое поведение связано с особенностями работы утилиты `pkgbuild` и тем, как она обрабатывает файлы, указанные в качестве источника для создания `.pkg`-файла.

Когда вы используете `pkgbuild` с аргументом `--root`, утилита ожидает, что эти файлы являются "исходными" для установки. При установке пакета, файлы из указанной директории действительно копируются в место назначения (в вашем случае — `/tmp/other/folder/again`). Однако это также может означать, что `pkgbuild` использует механизмы, которые контролируют и перемещают файлы для обеспечения целостности данных и того, чтобы исходные файлы не оставались в исходном расположении.

### Почему это происходит:

1. **Копирование и перемещение**: Некоторые утилиты, работающие с установкой, могут по умолчанию перемещать файлы вместо копирования, особенно если указанный путь, из которого они берутся, обрабатывается как временный или временное хранилище. Это может быть частью обработок или политик, связанных с безопасностью на уровне OS.

2. **Обработка папок**: Некоторые версии утилит могут вести себя так, чтобы в процессе установки избежать дублирования файлов и не оставлять их в исходной директории. Legally, это может выглядеть как "перемещение", но на самом деле это скорее всего просто более жесткая обработка этого процесса.

3. **Кэширование и временные файлы**: Возможно, что в процессе установки, для оптимизации, некоторые файлы переносятся в другую директорию. Эта директория может быть временной или требовать более строгих проверок для доступов и прав.

### Решение:

Если вы хотите предотвратить это поведение:

- Убедитесь, что каталог, который вы используете в качестве `--root`, не находится в читаемой или исполняемой директории, из которой могут быть вызваны лишние процессы установки. Параметр `--root` должен указывать на сосредоточенную папку, которая не используется для выполнения.
  
- Попробуйте создать более глубокую иерархию каталогов для ваших файлов, чтобы избежать ситуации, когда утилита по каким-то причинам начинает вести себя неожиданно.

### Заключение:

Исходя из вашего описания, это поведение может быть не совсем обычным для большинства пользователей, но связано скорее с особенностями работы самого установщика. Если проблема сохраняется, предлагаю исследовать другую структуру каталогов или провести более детальное изучение документации Apple о `pkgbuild` и `productbuild`, чтобы точно понять, как они управляют файлами.
Там ничего вообще не задокументировано. Смысл с этой дрянью вообще работать?
Похожие вопросы