xcode info.plist переменная сборки ${PRODUCT_NAME:rfc1034identifier} кажется полностью недокументированной?
Я пытаюсь найти документацию, которая описывает синтаксис и возможности, предложенные конструкцией ${PRODUCT_NAME:rfc1034identifier}
, Очевидно, это превращается в некоторую версию названия продукта, но где документация, которая описывает, как? Я просто выбрал весь каталог /Developer и ничего полезного не получил.
Я не ищу узкое определение того, что происходит с этой конкретной переменной, я хочу знать обо всех таких модификаторах, как rfc1034identifier
,
5 ответов
Используя strings
Я также выкопал следующие вещи, которые выглядят так, как будто они связаны с :rfc1034identifier
:
:quote
- добавляет обратную косую черту перед пробелами (и более) для использования в сценариях оболочки:identifier
- заменяет пробелы, косые черты (и многое другое) на подчеркивание:rfc1034identifier
- заменяет пробелы, косые черты (и более) тире:dir
- не знаю, заметил, заменить./
в некоторых случаях:abs
- не знаю
Точная команда:
strings /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Versions/A/DevToolsCore|grep '^:'
Есть еще вещи, которые выглядят как интересные модификаторы (например, :char-range=%@
), но я не мог заставить их работать. Там только один пример :char-range
в сети, и это из журнала аварий для Xcode.
Кто-то спросил, откуда мы знаем, что это спецификация модификатора. Ну, мы знаем, потому что он работает с несколькими переменными в настройках сборки. Препроцессор Plist, вероятно, использует те же механизмы для разрешения переменных сборки, что и система сборки.
Hack Saw, если вы получите ответ через этот отчет об ошибке, не забудьте проинформировать нас:-)
Похоже, вы можете сложить их тоже. Полезный случай, плавающий вокруг, есть
com.yourcompany.${PRODUCT_NAME:rfc1034identifier:lower}
такое, что название продукта "Ваше приложение" становится com.yourcompany.your-app
,
В конце концов, Apple выпустила некоторую документацию по этому вопросу. Это находится в разделе "Текстовые макросы" руководства XCode, на эту дату.
Ссылка на формат текстового макроса
Текстовый макрос может содержать любой допустимый текст Unicode. Он также может содержать другие текстовые макросы.
Включение других текстовых макросов Чтобы добавить другой текстовый макрос, добавьте три символа подчеркивания (_) до и после имени макроса:
___<MacroName>___
Изменение раскрытия текстового макроса Вы можете изменить окончательное расширение текстового макроса, добавив один или несколько модификаторов. Добавьте модификатор к текстовому макросу, поместив двоеточие (:) в конце макроса, за которым следует модификатор. Добавьте несколько модификаторов, разделяя их запятыми (,).
<MACRO>:<modifier>[,<modifier>]…
Например, следующий макрос удалит расширение пути из макроса FILENAME:
FILENAME:deletingPathExtension
Чтобы превратить измененный макрос выше в действительный идентификатор C, добавьте макрос идентификатора:
FILENAME:deletingPathExtension,identifier
Модификаторы
bundleIdentifier: заменяет любые не идентифицирующие символы идентификатора на дефис (-).
deletingLastPathComponent: удаляет последний компонент пути из строки расширения.
deletingPathExtension: удаляет любое расширение пути из строки расширения.
deletingTrailingDot: Удаляет любые конечные точки (.).
идентификатор: заменяет любые символы идентификатора, отличного от C, на подчеркивание (_).
lastPathComponent: возвращает только последний компонент пути строки расширения.
pathExtension: возвращает расширение пути строки расширения.
rfc1034Identifier: заменяет любые символы-идентификаторы, отличные от rfc1034, дефисом (-).
xml: заменяет специальные символы xml соответствующей escape-строкой. Например, меньше чем (<) заменяется на <
ТЕКСТ МАКРОС
Текстовые ссылки на макросы
АВТОРСКИЕ ПРАВА Строка авторского права, которая использует название компании команды для проекта. Если название компании отсутствует, строка будет пустой.
В примере показана строка с информацией об авторских правах, если для компании установлено значение "Apple".
Copyright © 2018 Apple. Все права защищены.
ДАТА Текущая дата.
DEFAULTTOOLCHAINSWIFTVERSION Версия Swift, используемая для набора инструментов по умолчанию.
FILEBASENAME Имя текущего файла без каких-либо расширений.
FILEBASENAMEASIDENTIFIER Имя текущего файла, закодированного как идентификатор C.
ФАЙЛДЕР Текст, помещаемый вверху каждого нового текстового файла.
FILENAME Полное имя текущего файла.
FULLUSERNAME Полное имя текущего пользователя macOS.
NSHUMANREADABLECOPYRIGHTPLIST Запись для удобочитаемой строки авторских прав в файле Info.plist цели приложения MacOS. Значение макроса должно включать разделители XML для plist. Например, допустимое значение:
'''
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2018 Apple, Inc. All rights reserved.</string>
'''
Обратите внимание, что значение включает перевод строки.
ИМЯ ОРГАНИЗАЦИИ Имя вашей организации, которое отображается в виде стандартного текста в папке вашего проекта. Название организации в вашем проекте не совпадает с названием организации, которое вы вводите в App Store Connect.
PACKAGENAME Имя пакета, построенного по текущей схеме.
PACKAGENAMEASIDENTIFIER Кодированная версия C-идентификатора имени пакета, построенная по текущей схеме.
PRODUCTNAME Имя приложения продукта, построенного по текущей схеме.
ИМЯ ПРОЕКТА Имя текущего проекта.
RUNNINGMACOSVERSION Версия macOS под управлением Xcode.
TARGETNAME Имя текущей цели.
ВРЕМЯ Текущее время.
USERNAME Имя пользователя для текущего пользователя macOS.
UUID Возвращает уникальный идентификатор. При первом использовании этого макроса он генерирует идентификатор перед возвратом. Вы можете использовать этот макрос для создания нескольких уникальных идентификаторов с помощью модификатора. Каждый модификатор возвращает идентификатор, уникальный для этого модификатора. Например, при первом использовании модификатора UUID:firstPurpose макрос генерирует и возвращает уникальный идентификатор для этой комбинации макроса и модификатора. Последующее использование модификатора UUID:firstPurpose возвращает тот же идентификатор. Добавление модификатора UUID:secondPurpose создает и возвращает другой идентификатор, который будет уникальным для UUID:secondPurpose и отличается от идентификатора для UUID:firstPurpose.
WORKSPACENAME Имя текущего рабочего пространства. Если открыт только один проект, то имя текущего проекта.
ГОД Текущий год в виде четырехзначного числа.
$ strings /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Versions/A/DevToolsCore
PRODUCTNAME
PRODUCTNAMEASIDENTIFIER
PRODUCTNAMEASRFC1034IDENTIFIER
PRODUCTNAMEASXML
Похоже, что есть:identifier,:rfc1034identifier и:xml модификаторы. Но я понятия не имею, кроме этого.
Наткнувшись на этот вопрос и существующие ответы, я должен сказать: документация Apple по этой теме за последние годы не улучшилась. В настоящее время мы находимся на Xcode 13, и до сих пор нет полного списка всех доступных модификаторов.
Поэтому я немного покопался и нашел поддерживаемые модификаторы в
DVTFoundation.framework
которые я перечислю ниже.
Я протестировал их все в настройках сборки Xcode 13.3 и использовал следующие два макроса, чтобы проиллюстрировать их влияние:
MY_MACRO = Some "text" with umlauts äöüçñ and special characters are ',/|\-_:;%&<>.!
MY_SOURCE = /Applications/Xcode.app/Contents/Frameworks/../SharedFrameworks/DVTFoundation.framework
Операторы/модификаторы поиска
Модификаторы извлечения используются для извлечения и/или преобразования всех или частей макроса/переменной/настройки.
Они применяются с использованием следующего синтаксиса:
$(<VARIABLE>:<MODIFIER>)
-
quote
: экранирует все символы, которые имеют особое значение в сценариях/командах оболочки, такие как пробел, двоеточие, точка с запятой и обратная косая черта.
RESULT_quote = $(MY_MACRO:quote)
Some\ \"text\"\ with\ umlauts\ äöüçñ\ and\ special\ characters\ are\ \',/|\\-_:;%&<>.!
-
upper
: преобразует все символы в их эквиваленты в верхнем регистре.
RESULT_upper = $(MY_MACRO:upper)
SOME "TEXT" WITH UMLAUTS ÄÖÜÇÑ AND SPECIAL CHARACTERS ARE ',/|\-_:;%&<>.!
-
lower
: преобразует все символы в их эквиваленты в нижнем регистре.
RESULT_lower = $(MY_MACRO:lower)
some "text" with umlauts äöüçñ and special characters are ',/|\-_:;%&<>.!
-
identifier
: заменяет любые символы идентификатора, отличные от C, символом подчеркивания (_).
RESULT_identifier = $(MY_MACRO:identifier)
Some__text__with_umlauts_______and_special_characters_are________________
-
rfc1034identifier
: заменяет любые символы идентификатора, отличные от rfc1034, дефисом (-).
RESULT_rfc1034identifier = $(MY_MACRO:rfc1034identifier)
Some--text--with-umlauts-------and-special-characters-are----------------------------
-
c99extidentifier
: заменяет любые символы идентификатора, отличные от C99, символом подчеркивания (_). Разрешены умляуты, так как C99 использует Unicode!
RESULT_c99extidentifier = $(MY_MACRO:c99extidentifier)
Some__text__with_umlauts_äöüçñ_and_special_characters_are___________________________
-
xml
: Согласно документации Apple, он должен заменять специальные символы xml соответствующей escape-строкой. Например, меньше (<) заменяется на <. Но в моих примерах это не сработало .
RESULT_xml = $(MY_MACRO:xml)
Some "text" with umlauts äöüçñ and special characters are ',/|\-_:;%&<>.!
-
dir
: Извлекает часть каталога из пути.
RESULT_dir = $(MY_SOURCE:dir)
/Applications/Xcode.app/Contents/Frameworks/../SharedFrameworks/
-
file
: извлекает часть имени файла из пути
RESULT_file = $(MY_SOURCE:file)
DVTFoundation.framework
-
base
: извлекает базовую часть имени файла из пути (=имя файла без суффикса/расширения).
RESULT_base = $(MY_SOURCE:base)
DVTFoundation
-
suffix
: извлекает расширение/суффикс имени файла из пути или имени файла.
RESULT_suffix = $(MY_SOURCE:suffix)
.framework
-
standardizepath
: Стандартизирует путь (например,../
и тильда (~) разрешены)
RESULT_standardizepath = $(MY_SOURCE:standardizepath)
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework
Замена операторов/модификаторов
Помимо вышеперечисленных операторов извлечения/преобразования, в систему настроек сборки встроена поддержка замены определенных частей каталога, которые сопоставляются с использованием модификатора.
Они применяются с использованием следующего синтаксиса:
$(<VARIABLE>:<MODIFIER>=<VALUE>)
-
dir=<VALUE>
: Заменяет часть каталога пути на<VALUE>
и возвращает новый путь
RESULT2_dir = $(MY_SOURCE:dir=/Developer/SharedFrameworks)
/Developer/SharedFrameworks/DVTFoundation.framework
-
file=<VALUE>
: заменяет часть имени файла пути и возвращает новый путь
RESULT2_file = $(MY_SOURCE:file=my_file.txt)
/Applications/Xcode.app/Contents/Frameworks/../SharedFrameworks/my_file.txt
-
base=<VALUE>
: заменяет базовую часть имени файла пути (=имя файла без суффикса/расширения) и возвращает новый путь.
RESULT2_base = $(MY_SOURCE:base=Dummy)
/Applications/Xcode.app/Contents/Frameworks/../SharedFrameworks/Dummy.framework
-
suffix=<VALUE>
: Заменяет расширение/суффикс имени файла на путь и возвращает новый путь.
RESULT2_suffix = $(MY_SOURCE:suffix=.txt)
/Applications/Xcode.app/Contents/Frameworks/../SharedFrameworks/DVTFoundation.txt
Я надеюсь, что этот список поможет большему количеству людей, которые смотрят на настройки сборки Xcodes и задаются вопросом, как их можно преобразовать.