How can I conditionally include a file based on build configuration in Xcode?

后端 未结 6 1721
时光取名叫无心
时光取名叫无心 2020-12-07 08:06

I have an Xcode project with a large number of targets where I would like to include a settings bundle for apps built under the Ad-hoc and Debug configurations, but not unde

相关标签:
6条回答
  • 2020-12-07 08:16

    Settings.bundle is always copied into destination area no matter whether Release or Debug configuration. So, maybe you need the following code:

    if [ ${CONFIGURATION} == "Release" ]; then
        rm -rf ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle
    fi
    
    0 讨论(0)
  • 2020-12-07 08:25

    I know this question has been answered already, and the answer was very helpful to me, but I wanted to throw my own modified solution out there as well.

    My requirement was to have different settings bundles for different build configurations, rather than just not including it at release. Assuming a simplistic approach of only Debug and Release configurations, here's how to do it:

    Start by adding 2 settings bundles to the project, named Settings-debug.bundle and Settings-release.bundle and then remove these files from the Copy Bundle Resources build phase. Next add a user defined build setting called SETTINGS_BUNDLE, which has different values for each configuration:

    Debug        ${PROJECT_DIR}/relative/path/to/Settings-debug.bundle
    Release      ${PROJECT_DIR}/relative/path/to/Settings-release.bundle
    

    Next add a run-script build phase (after Copy Bundle Resources) named Copy Settings Bundle with a modified version of the script in Frank's solution.

    cp -r "${SETTINGS_BUNDLE}/" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle"
    

    The difference here is that the copied bundle is always named Settings.bundle regardless of the source name.

    You then need to add another build phase script to prevent code signing errors when the only changes are in the settings bundles. It forces the code signing step to occur on every build. This should run before the Compile Source Files build phase. I called mine Force Codesign.

    touch "${PROJECT_DIR}/relative/path/to/main.m"
    
    0 讨论(0)
  • 2020-12-07 08:25

    For complied sources, there is a poorly documented user defined build setting that can be added. Files can be both excluded and included from compilation

    Go to your target's Build Settings > Tap the + button > Add User-Defined Setting

    The key is either INCLUDED_SOURCE_FILE_NAMES or EXCLUDED_SOURCE_FILE_NAMES

    The value is a space separated list of file paths

    See reference: http://lists.apple.com/archives/xcode-users/2009/Jun/msg00153.html

    0 讨论(0)
  • 2020-12-07 08:25

    I am no shell script expert but I think you need space between the square brackets and the condition. Also, quoting the variables may help:

    if [ "${CONFIGURATION}" = "Debug" ] then
        cp -r "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}"/.
    fi
    

    As for the location, I use "$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME" for the root of my OS X app bundle.

    0 讨论(0)
  • 2020-12-07 08:29

    I finally figured it out.

    For each target for which you want to conditionally include the settings bundle, choose its Project from the source list, choose the target, and switch to the "Build Phases" tab.

    Click the "Add Build Phase" button and choose "Add Run Script".

    Then enter the following for the script:

    if [ "${CONFIGURATION}" == "Debug" ]; then
        cp -r "${PROJECT_DIR}/Settings.bundle" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app"
    fi
    
    0 讨论(0)
  • 2020-12-07 08:35

    (Tested with Xcode 9.3)

    I can't find when Xcode included this feature but EXCLUDED_SOURCE_FILE_NAMES is now directly available in Build Settings > Build Options > Excluded Source File Names.

    So you no longer need to create a User-Defined Setting.

    See below:

    It will automatically add this line in your .pbxproj.

    0 讨论(0)
提交回复
热议问题