Невозможно кодировать приложение с помощью Python и Node - PullRequest
0 голосов
/ 11 января 2019

У меня довольно большое и сложное приложение. Это около 550 мегабайт без сжатия с около 36 000 файлов. Поскольку основной исходный код написан на Python, я использую pyInstaller для создания исходного файла .app. Затем я копирую все остальное, что нужно приложению (документы, образцы, node_modules и т. Д.) В подпапку Content/MacOS в файле XXX.app. (Да, он тоже использует node.)

.app работает правильно - но должен быть подписан. По словам Apple, недостаточно просто подписать XXX.app: все компоненты в нем также должны быть подписаны. Сначала я попробовал этот маршрут - но, кажется, каждый .txt, .png и все другие файлы должны быть подписаны. Это 36 000 codesign команд!

Другой вариант заключается в использовании опции codesign --deep. Apple предупреждает в TN2206 :

Важно: хотя параметр --deep может применяться к подписи операция, это не рекомендуется. Мы рекомендуем вам подписать код наизнанку на отдельных этапах (как Xcode делает автоматически). подписание с --deep предназначен только для срочного ремонта и временных настроек.

Независимо от этого, кажется, что многие компоненты не могут быть подписаны кодовым знаком:

"bundle format unrecognized, invalid, or unsuitable
In subcomponent: /Users/george/Files/dist/XXX.app/Contents/MacOS/node/node_modules/lodash.debounce"

Я предполагаю, что codesign не может работать с определенными именами компонентов, такими как lodash.debounce, 20140401180856!About.png или .bin.

Как, черт возьми, я могу подписать это приложение?

1 Ответ

0 голосов
/ 15 января 2019

Все улажено. Было несколько вещей, которые нужно было исправить. Вот они, в надежде, что они помогут кому-то еще в будущем. TN2206 от Apple полон полезных советов и заслуживает понимания.

√ Извлеките все, что не связано с вашей основной исполняемой библиотекой, из папки Contents/MacOS. Переместите его на Contents/Resources и установите символические ссылки.

√ Если вы используете Node, он должен быть в Contents / Resources. Установите ссылку из Contents/MacOS следующим образом, пока вы находитесь в папке Contents/MacOS:

ln -s ../Resources/node node

√ Ссылки должны быть относительными, поскольку приложение должно быть переносимым. При установке в другой системе полный путь не будет таким же.

√ Не используйте флаг --deep, даже если это заманчиво. Мне нужно 110 codesign операторов, по одному для каждой библиотеки. Python считается библиотекой:

codesign --force --verify --verbose=4 --sign "Developer ID Application: NS BASIC Corporation" ~/Files/dist/AppStudio.app/Contents/MacOS/Python

√ После того как вы сделали codesign для каждой библиотеки, codesign само приложение:

codesign --force --verify --verbose=4 --sign "Developer ID Application: NS BASIC Corporation" ~/Files/dist/AppStudio.app

Затем убедитесь, что все работает правильно:

codesign --display --verbose=4 ~/Files/dist/AppStudio.app

√ Если вы видите сообщение типа

"code object is not signed at all
In subcomponent: /Users/george/Files/dist/AppStudio.app/Contents/MacOS/_Ctl.so"

Это означает, что вы пропустили библиотеку.

√ Если вы получаете сообщение, подобное этому:

"bundle format unrecognized, invalid, or unsuitable
In subcomponent: /Users/george/Files/dist/AppStudio.app/Contents/MacOS/node/node_modules/.bin"

Это не библиотека. Вытащите его из Contents/MacOS, переместите в Contents/Resources и установите символическую ссылку. (Я смотрю на тебя, cacert.pem!)

√ Как только вы думаете, что у вас есть, используйте эту команду, чтобы проверить окончательное приложение:

codesign --vvvv AppStudio.app

Удачи в вашем проекте!

...