【发布时间】:2022-10-04 18:24:19
【问题描述】:
我可以为多个目标重复使用相同的构建阶段吗?
我的项目中有多个目标,我想为所有目标运行 SwiftLint 作为构建阶段。
有没有一种方法可以在不重复构建阶段的情况下实现这一目标?
【问题讨论】:
标签: xcode xcodebuild swiftlint xcode-build-settings
我可以为多个目标重复使用相同的构建阶段吗?
我的项目中有多个目标,我想为所有目标运行 SwiftLint 作为构建阶段。
有没有一种方法可以在不重复构建阶段的情况下实现这一目标?
【问题讨论】:
标签: xcode xcodebuild swiftlint xcode-build-settings
你可以。虽然有点手动。
当您创建构建阶段时,Xcode 会为构建阶段创建一个唯一的参考 id。 Xcode 有一个包含名称和参考 ID 的构建阶段数组。此引用 id 用于引用构建阶段的内容。
如果您打开 .pbxproj 文件,您可以手动将参考 ID 更改为相同。该文件位于您的.xcodeproj 中。在 finder 中显示项目 -> 右键单击 .xcodeproj 文件 -> 单击 Show Package Contents -> 打开 project.pbxproj 文件。
在项目文件中,您可以在每个目标中找到构建阶段“数组”。该部分将如下所示:
buildPhases = (
1232BB9B27B275C300A05A1E /* Sources */,
1232BB9C27B275C300A05A1E /* Frameworks */,
1232BB9D27B275C300A05A1E /* Resources */,
346E52AF28EC321F00CB6A61 /* SwiftLint */,
);
第一项是参考 id,为了清楚起见,注释告诉了参考构建阶段的名称。稍后在文件中,您可以找到构建阶段的实际实现。我的SwiftLint 阶段如下所示:
/* Begin PBXShellScriptBuildPhase section */
346E52AF28EC321F00CB6A61 /* SwiftLint */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = SwiftLint;
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# This workflow is shared between all targets.
export PATH="$PATH:$HOME/.mint/bin"
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed. Follow the instructions located in docs/styleGuide.md."
fi
";
};
/* End PBXShellScriptBuildPhase section */
如果您通过复制粘贴内容多次进行构建阶段,您将拥有多个具有不同 ID 的相同构建阶段。
因此,您可以删除重复的阶段并将所有目标的参考 ID 替换为剩余的构建阶段 ID。在这种情况下346E52AF28EC321F00CB6A61。
花了我一点时间才发现这一点,所以希望这可以帮助其他人寻找相同的解决方案。
【讨论】: