【问题标题】:Reusing build phase for multiple targets in Xcode在 Xcode 中为多个目标重用构建阶段
【发布时间】:2022-10-04 18:24:19
【问题描述】:

我可以为多个目标重复使用相同的构建阶段吗?

我的项目中有多个目标,我想为所有目标运行 SwiftLint 作为构建阶段。

有没有一种方法可以在不重复构建阶段的情况下实现这一目标?

【问题讨论】:

    标签: xcode xcodebuild swiftlint xcode-build-settings


    【解决方案1】:

    你可以。虽然有点手动。

    当您创建构建阶段时,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

    花了我一点时间才发现这一点,所以希望这可以帮助其他人寻找相同的解决方案。

    【讨论】:

      猜你喜欢
      • 2015-02-07
      • 1970-01-01
      • 2022-10-14
      • 2015-04-13
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      相关资源
      最近更新 更多