Xcode的info.plist构建变量${PRODUCT_NAME:rfc1034identifier}似乎完全没有文档记录?

36
我正在寻找描述${PRODUCT_NAME:rfc1034identifier}结构语法和可能性的文档。显然,这会变成某个产品名称的版本,但是有哪些文档描述这样做的方式呢?我刚刚grep整个/Developer目录,没有找到任何有用的信息。
我不是在寻找特定变量发生的狭义定义,我想了解所有这样的修改器,例如rfc1034identifier

1
这可能对您有帮助:https://dev59.com/3HE95IYBdhLWcg3wE5yC#2468382 - iHS
我真的在寻找一个正式的定义。如果把事情当作魔法般使用,这让我感到非常紧张。 - Hack Saw
你确定 ":" 是修饰符而不仅仅是宏名称中的另一个字符吗?合法字符列表在哪里? - hotpaw2
这就是我所问的。除了其他事情。 - Hack Saw
向苹果开发者问题提交了申请。 - Hack Saw
向苹果公司报告了一个错误,因为DTS的人也找不到任何文档。https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/9/wo/KH4SJ0c6l97laT7FC9Vigw/10.60 - Hack Saw
5个回答

33

我还使用了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 报告收到回复,请不要忘记告诉我们 :-)


我一定会的。感谢您的调查! - Hack Saw
3
如果使用独立的 Xcode.app,路径为 /Applications/Xcode.app/Contents/OtherFrameworks/DevToolsCore.framework/Versions/A/DevToolsCore - bradley.ayers
1
看起来http://codeworkshop.net/posts/xcode-build-setting-transformations有一些有用的解释。 - Heath Borders

13

看起来你也可以将它们叠放在一起。那里有一个有用的例子流传着

com.yourcompany.${PRODUCT_NAME:rfc1034identifier:lower}

让一个名为 "Your App" 的产品名称变成 com.yourcompany.your-app


2
谢谢提示!我正在寻找一些将变量转换为大写的方法,似乎 :upper 也可以(XCode 8.2.1)。 - aleh

12

终于,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 字符。例如,小于号(<)会被替换成&lt;

文本宏

文本宏参考

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 当前年份,格式为四位数。


4
$ strings /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Versions/A/DevToolsCore

PRODUCTNAME
PRODUCTNAMEASIDENTIFIER
PRODUCTNAMEASRFC1034IDENTIFIER
PRODUCTNAMEASXML

似乎有 :identifier、:rfc1034identifier 和 :xml 三种修饰符。但我对此一无所知。

看起来我们不得不诉诸取证才能获得线索,这很令人沮丧。我想我必须向苹果提交一个错误报告。 - Hack Saw
但是,你为什么想知道这些修饰符呢?我从来没有见过除了 PRODUCT_NAME:rfc1034identifier 和 PRODUCT_NAME:identifier 以外的任何修饰符。 - Kazuki Sakamoto
1
我想知道它们被定义为做什么。在我看来,未记录的“功能”很容易出错。也许它们将得到支持,也许它们是稳定的,可能不是。 - Hack Saw

2
在看到这个问题及其现有答案后,我必须说:多年来,苹果的文档在这个主题上并没有得到改善。我们目前使用的是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: 转义所有在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

我希望这个列表能够帮助更多查看Xcode构建设置并想知道如何转换它们的人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接