Xcode 10 构建阶段 Shell 脚本

问题描述 投票:0回答:4

在我们的项目中,我们从 git 标签等导出我们的发布版本,然后使用如下 shell 脚本将其写入构建文件夹的 Info.plist:

GIT_RELEASE_VERSION=$(some git command)
defaults write "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH%.*}" "CFBundleShortVersionString" "${GIT_RELEASE_VERSION#*v}"

这对所有过去的 Xcode 版本都有效,但在 Xcode 10 的新构建系统中,这未能实际更新 info.list 文件中的 CFBundleShortVersionString。不过,该值已使用 Xcode 10 的 Legacy Build System 正确更新。

我在脚本中添加了一些回声并比较了新旧系统上的构建日志,看不出有什么区别:

echo "git release version:" ${GIT_RELEASE_VERSION}
echo "info path:" ${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH%.*}
echo "grv:" "${GIT_RELEASE_VERSION#*v}"

不确定是否有人遇到过新构建系统的类似问题?

xcode10
4个回答
17
投票

似乎问题在于有时您的

Run Script Phase
会在Xcode创建
Info.plist
之前执行。如果您想确保您的脚本阶段在特定步骤之后运行,您需要使用输入来标记您的依赖项。

例如添加:

$(TARGET_BUILD_DIR)/$(INFOPLIST_PATH)

作为脚本阶段的输入,应该强制执行您正在寻找的顺序:Xcode 将创建

Info.plist
,之后的某个时间,您的脚本将执行并修改
Info.plist
.

Xcode 14 编辑 - J Nozzi

根据下面的评论,上面的内容对我来说并不完全有效,因为它一直声称它会在每次构建时运行。将

$(DERIVED_FILE_DIR)/$(INFOPLIST_PATH)
添加到 Output Files 列表中。


3
投票

(Xcode 11.2)

  • 在新构建系统中,任何自定义构建步骤都将在 before 新构建系统的
    Process .../Info.plist
    步骤:

  • 要在 Xcode 完成构建后运行 shell 脚本,您可以将其作为构建后操作添加到方案中:

Product > Scheme > Edit Scheme... > Build > Post-actions

  • 如果您要引用任何构建系统环境变量(例如

    BUILT_PRODUCTS_DIR
    INFOPLIST_PATH
    ),请确保更改 Provide build settings from 选择。

  • 添加您的 shell 脚本,但请记住,如果您编辑应用程序包中的任何文件(即

    Info.plist
    ),您将需要重新签署应用程序。将此添加到您的后期构建步骤:

export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate
/usr/bin/codesign --force --sign - --entitlements "${TARGET_TEMP_DIR}/${FULL_PRODUCT_NAME}.xcent" --timestamp=none "${CODESIGNING_FOLDER_PATH}"

0
投票

这里有同样的问题......一种解决方法是清理然后执行完整构建。

Xcode 10 中的新构建系统在完整构建和增量构建中以不同方式运行 Process Info.plist 步骤:

  • 完整构建:处理资产之后,链接故事板之前(链接 步骤)
  • 增量:嵌入框架之后,签名之前。

实际问题是作为构建步骤运行并更新已处理 Info.plist 文件的脚本需要始终在文件处理之后但签名之前运行。


0
投票

类似于上面的答案(还不能评论)但略有变化。

脚本输入文件:

$(PROJECT_DIR)/$(INFOPLIST_FILE)      
$(TARGET_BUILD_DIR)/$(INFOPLIST_PATH)

输出文件:

$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)

我用一个脚本创建了一个要点,我用它来设置捆绑版本和一些额外的信息,比如标签、日期、分支。

https://gist.github.com/JoeMatt/aedd459c54a383373231719e508a2a36

© www.soinside.com 2019 - 2024. All rights reserved.