${PRODUCT_NAME:rfc1034identifier}
结构语法和可能性的文档。显然,这会变成某个产品名称的版本,但是有哪些文档描述这样做的方式呢?我刚刚grep整个/Developer目录,没有找到任何有用的信息。我不是在寻找特定变量发生的狭义定义,我想了解所有这样的修改器,例如
rfc1034identifier
。${PRODUCT_NAME:rfc1034identifier}
结构语法和可能性的文档。显然,这会变成某个产品名称的版本,但是有哪些文档描述这样做的方式呢?我刚刚grep整个/Developer目录,没有找到任何有用的信息。rfc1034identifier
。我还使用了strings
,并挖掘出下面的东西,看起来它们与:rfc1034identifier
有关:
:quote
- 在空格(以及其他字符)之前添加反斜线,用于 shell 脚本:identifier
- 将空格、斜杠(以及其他字符)替换为下划线:rfc1034identifier
- 将空格、斜杠(以及其他字符)替换为破折号:dir
- 不知道,在某些情况下观察到将其替换为./
:abs
- 不知道精确命令:
strings /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Versions/A/DevToolsCore|grep '^:'
还有更多看起来很有趣的修改器(例如:char-range=%@
),但我无法使它们工作。网络上只有一个:char-range
的示例,而且它是来自于 Xcode 的崩溃日志。
有人问怎么知道这是一个修改器规范。我们知道它可以在构建设置的多个变量上工作。Plist 预处理器可能使用与构建系统相同的机制来解析构建变量。
Hack Saw,如果你通过那个 bug 报告收到回复,请不要忘记告诉我们 :-)
Xcode.app
,路径为 /Applications/Xcode.app/Contents/OtherFrameworks/DevToolsCore.framework/Versions/A/DevToolsCore
。 - bradley.ayers看起来你也可以将它们叠放在一起。那里有一个有用的例子流传着
com.yourcompany.${PRODUCT_NAME:rfc1034identifier:lower}
让一个名为 "Your App" 的产品名称变成 com.yourcompany.your-app
。
终于,Apple发布了一些关于这个的文档。截至本日期,文档在Xcode手册的“文本宏”部分。
文本宏可以包含任何有效的Unicode文本,也可以包含其他文本宏。
包含其他文本宏 要包含另一个文本宏,在宏名称前后添加三个下划线(_)字符:
___<MacroName>___
修改文本宏展开 您可以通过添加一个或多个修饰符来修改文本宏的最终展开。通过在宏末尾加冒号(:)并跟随修饰符来添加修饰符。通过用逗号(,)分隔每个修饰符来添加多个修饰符。
<MACRO>:<modifier>[,<modifier>]…
例如,下面的宏将从FILENAME宏中删除路径扩展名:FILENAME:deletingPathExtension
为了将上面修改过的宏定义转换为合法的C标识符,需要添加标识符宏定义:FILENAME:deletingPathExtension,identifier
bundleIdentifier: 用连字符(-)替换任何非包标识符字符。
deletingLastPathComponent: 从扩展字符串中删除最后一个路径组件。
deletingPathExtension: 从扩展字符串中删除任何路径扩展名。
deletingTrailingDot: 删除任何尾随点(.)。
identifier: 用下划线(_)替换任何非 C 标识符字符。
lastPathComponent: 返回扩展字符串的最后一个路径组件。
pathExtension: 返回扩展字符串的路径扩展名。
rfc1034Identifier: 用连字符(-)替换任何非 rfc1034 标识符字符。
xml: 用相应的转义字符串替换特殊的 xml 字符。例如,小于号(<)会被替换成<
文本宏参考
COPYRIGHT 使用项目团队公司名称的版权字符串。如果没有公司名称,则为空字符串。
示例显示了当公司设置为“Apple”时的版权字符串。
版权所有 © 2018 Apple。保留所有权利。
DATE 当前日期。
DEFAULTTOOLCHAINSWIFTVERSION 默认工具链使用的 Swift 版本。
FILEBASENAME 当前文件的名称,不带任何扩展名。
FILEBASENAMEASIDENTIFIER 将当前文件的名称编码为 C 标识符。
FILEHEADER 放置在每个新文本文件顶部的文本。
FILENAME 当前文件的完整名称。
FULLUSERNAME 当前 macOS 用户的完整名称。
NSHUMANREADABLECOPYRIGHTPLIST macOS 应用程序目标的 Info.plist 文件中用于人类可读版权字符串的条目。宏的值必须包括 plist 的 XML 分隔符。例如,有效值为:
'''
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2018 Apple, Inc. All rights reserved.</string>
'''
注意该值包括换行符。
ORGANIZATIONNAME 您组织的名称,将在整个项目文件夹中出现的样板文本中。项目中的组织名称与您在 App Store Connect 中输入的组织名称不同。
PACKAGENAME 当前方案构建的包名称。
PACKAGENAMEASIDENTIFIER 当前方案构建的包名称的 C 标识符编码版本。
PRODUCTNAME 当前方案构建的产品的应用程序名称。
PROJECTNAME 当前项目的名称。
RUNNINGMACOSVERSION 正在运行 Xcode 的 macOS 版本。
TARGETNAME 当前目标的名称。
TIME 当前时间。
USERNAME 当前 macOS 用户的登录名。
UUID 返回一个唯一的 ID。第一次使用此宏时,会生成该 ID 并返回它。您可以通过使用修饰符来使用此宏创建多个唯一的 ID。每个修饰符返回一个对于该修饰符而言是唯一的 ID。例如,第一次使用 UUID:firstPurpose 修饰符时,该宏会为该宏和修饰符组合生成并返回一个唯一的 ID。之后再次使用 UUID:firstPurpose 修饰符会返回相同的 ID。添加 UUID:secondPurpose 修饰符会生成并返回一个不同的唯一 ID,该 ID 将对于 UUID:secondPurpose 是唯一的,并且与 UUID:firstPurpose 的 ID 不同。
WORKSPACENAME 当前工作区的名称。如果只打开了一个项目,则为当前项目的名称。
YEAR 当前年份,格式为四位数。
$ strings /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Versions/A/DevToolsCore
PRODUCTNAME
PRODUCTNAMEASIDENTIFIER
PRODUCTNAMEASRFC1034IDENTIFIER
PRODUCTNAMEASXML
DVTFoundation.framework
中找到了支持的修饰符,下面将列出它们。MY_MACRO = Some "text" with umlauts äöüçñ and special characters are ',/|\-_:;%&<>.!
MY_SOURCE = /Applications/Xcode.app/Contents/Frameworks/../SharedFrameworks/DVTFoundation.framework
检索修饰符用于提取和/或转换宏、变量或设置的全部或部分。
它们使用以下语法应用:$(<VARIABLE>:<MODIFIER>)
quote
: 转义所有在shell脚本/命令中具有特殊含义的字符,如空格、冒号、分号和反斜杠。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 ',/|\-_:;%&<>.!
标识符
:将任何非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,因此允许使用umlauts!RESULT_c99extidentifier = $(MY_MACRO:c99extidentifier)
Some__text__with_umlauts_äöüçñ_and_special_characters_are___________________________
xml
: 根据苹果文档,应该使用相应的转义字符串替换特殊的xml字符。例如,小于号(<)应该被替换为<。但在我的例子中,这并没有起作用。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