What are some good Xcode scripts to speed up development?

前端 未结 6 571
情深已故
情深已故 2021-01-31 12:54

Xcode allows you to create automated scripts for performing repetitive tasks. What scripts have you written to speed up development?

6条回答
  •  轮回少年
    2021-01-31 13:01

    I've created three for my JSON.Framework for Cocoa and the iPhone. These take care of the following:

    • Creates a release Disk Image with dynamic embedded Framework, custom iPhone SDK, API documentation and some documentation files in.
    • Run Doxygen over the source to create an Xcode-compatible documentation set and install this. This means when you search for things in Xcode's documentation search your documentation can be found too.
    • Run Doxygen over the source to update a checked-in version of the API documentation in the source tree itself. This is pretty neat if you use Subversion (which it assumes) as the documentation is always up-to-date for the branch you're in. Great if you're hosting on Google Code, for example.

    Beware some hard-coded project-specific values in the below. I didn't want to potentially break the scripts by editing those out. These are launched from a Custom Script Phase in Xcode. You can see how they're integrated in the Xcode project for the project linked above.

    CreateDiskImage.sh:

    #!/bin/sh
    
    set -x
    
    # Determine the project name and version
    VERS=$(agvtool mvers -terse1)
    
    # Derived names
    VOLNAME=${PROJECT}_${VERS}
    DISK_IMAGE=$BUILD_DIR/$VOLNAME
    DISK_IMAGE_FILE=$INSTALL_DIR/$VOLNAME.dmg
    
    # Remove old targets
    rm -f $DISK_IMAGE_FILE
    test -d $DISK_IMAGE && chmod -R +w $DISK_IMAGE && rm -rf $DISK_IMAGE
    mkdir -p $DISK_IMAGE
    
    # Create the Embedded framework and copy it to the disk image.
    xcodebuild -target JSON -configuration Release install || exit 1
    cp -p -R $INSTALL_DIR/../Frameworks/$PROJECT.framework $DISK_IMAGE
    
    IPHONE_SDK=2.2.1
    
    # Create the iPhone SDK directly in the disk image folder.
    xcodebuild -target libjson -configuration Release -sdk iphoneos$IPHONE_SDK install \
        ARCHS=armv6 \
        DSTROOT=$DISK_IMAGE/SDKs/JSON/iphoneos.sdk || exit 1
    sed -e "s/%PROJECT%/$PROJECT/g" \
        -e "s/%VERS%/$VERS/g" \
        -e "s/%IPHONE_SDK%/$IPHONE_SDK/g" \
        $SOURCE_ROOT/Resources/iphoneos.sdk/SDKSettings.plist > $DISK_IMAGE/SDKs/JSON/iphoneos.sdk/SDKSettings.plist || exit 1
    
    xcodebuild -target libjson -configuration Release -sdk iphonesimulator$IPHONE_SDK install \
        ARCHS=i386 \
        DSTROOT=$DISK_IMAGE/SDKs/JSON/iphonesimulator.sdk || exit 1
    sed -e "s/%PROJECT%/$PROJECT/g" \
        -e "s/%VERS%/$VERS/g" \
        -e "s/%IPHONE_SDK%/$IPHONE_SDK/g" \
        $SOURCE_ROOT/Resources/iphonesimulator.sdk/SDKSettings.plist > $DISK_IMAGE/SDKs/JSON/iphonesimulator.sdk/SDKSettings.plist || exit 1    
    
    # Allow linking statically into normal OS X apps
    xcodebuild -target libjson -configuration Release -sdk macosx10.5 install \
        DSTROOT=$DISK_IMAGE/SDKs/JSON/macosx.sdk || exit 1
    
    # Copy the source verbatim into the disk image.
    cp -p -R $SOURCE_ROOT/Source $DISK_IMAGE/$PROJECT
    rm -rf $DISK_IMAGE/$PROJECT/.svn
    
    # Create the documentation
    xcodebuild -target Documentation -configuration Release install || exit 1
    cp -p -R $INSTALL_DIR/Documentation/html $DISK_IMAGE/Documentation
    rm -rf $DISK_IMAGE/Documentation/.svn
    
    cat < $DISK_IMAGE/Documentation.html
    
    
    
    
    
    

    Aw, shucks! I tried to redirect you to the api documentation but obviously failed. Please find it yourself.

    HTML cp -p $SOURCE_ROOT/README $DISK_IMAGE cp -p $SOURCE_ROOT/Credits.rtf $DISK_IMAGE cp -p $SOURCE_ROOT/Install.rtf $DISK_IMAGE cp -p $SOURCE_ROOT/Changes.rtf $DISK_IMAGE hdiutil create -fs HFS+ -volname $VOLNAME -srcfolder $DISK_IMAGE $DISK_IMAGE_FILE

    InstallDocumentation.sh:

    #!/bin/sh
    # See also http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
    
    set -x
    
    VERSION=$(agvtool mvers -terse1)
    
    DOXYFILE=$DERIVED_FILES_DIR/doxygen.config
    DOXYGEN=/Applications/Doxygen.app/Contents/Resources/doxygen
    DOCSET=$INSTALL_DIR/Docset
    
    rm -rf $DOCSET
    mkdir -p $DOCSET || exit 1
    mkdir -p $DERIVED_FILES_DIR || exit 1
    
    if ! test -x $DOXYGEN ; then
        echo "*** Install Doxygen to get documentation generated for you automatically ***"
        exit 1
    fi
    
    # Create a doxygen configuration file with only the settings we care about
    $DOXYGEN -g - > $DOXYFILE
    
    cat <> $DOXYFILE
    
    PROJECT_NAME           = $FULL_PRODUCT_NAME
    PROJECT_NUMBER         = $VERSION
    OUTPUT_DIRECTORY       = $DOCSET
    INPUT                  = $SOURCE_ROOT/Source
    FILE_PATTERNS          = *.h *.m
    
    HIDE_UNDOC_MEMBERS     = YES
    HIDE_UNDOC_CLASSES     = YES
    HIDE_UNDOC_RELATIONS   = YES
    REPEAT_BRIEF           = NO
    CASE_SENSE_NAMES       = YES
    INLINE_INHERITED_MEMB  = YES
    SHOW_FILES             = NO
    SHOW_INCLUDE_FILES     = NO
    GENERATE_LATEX         = NO
    GENERATE_HTML          = YES
    GENERATE_DOCSET        = YES
    DOCSET_FEEDNAME        = "$PROJECT.framework API Documentation"
    DOCSET_BUNDLE_ID       = org.brautaset.$PROJECT
    
    EOF
    
    #  Run doxygen on the updated config file.
    #  doxygen creates a Makefile that does most of the heavy lifting.
    $DOXYGEN $DOXYFILE
    
    #  make will invoke docsetutil. Take a look at the Makefile to see how this is done.
    make -C $DOCSET/html install
    
    #  Construct a temporary applescript file to tell Xcode to load a docset.
    rm -f $TEMP_DIR/loadDocSet.scpt
    
    cat < $TEMP_DIR/loadDocSet.scpt
    tell application "Xcode"
        load documentation set with path "/Users/$USER/Library/Developer/Shared/Documentation/DocSets/org.brautaset.${PROJECT}.docset/"
    end tell
    EOF
    
    # Run the load-docset applescript command.
    osascript $TEMP_DIR/loadDocSet.scpt
    

    RegenerateDocumentation.sh:

    #!/bin/sh
    # See also http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
    
    set -x
    
    VERSION=$(agvtool mvers -terse1)
    
    DOXYFILE=$DERIVED_FILES_DIR/doxygen.config
    DOXYGEN=/Applications/Doxygen.app/Contents/Resources/doxygen
    DOCSET=$INSTALL_DIR/Documentation
    APIDOCDIR=$SOURCE_ROOT/documentation
    
    rm -rf $DOCSET
    mkdir -p $DOCSET || exit 1
    mkdir -p $DERIVED_FILES_DIR || exit 1
    
    if ! test -x $DOXYGEN ; then
        echo "*** Install Doxygen to get documentation generated for you automatically ***"
        exit 1
    fi
    
    # Create a doxygen configuration file with only the settings we care about
    $DOXYGEN -g - > $DOXYFILE
    
    cat <> $DOXYFILE
    
    PROJECT_NAME           = $FULL_PRODUCT_NAME
    PROJECT_NUMBER         = $VERSION
    OUTPUT_DIRECTORY       = $DOCSET
    INPUT                  = $SOURCE_ROOT/Source
    FILE_PATTERNS          = *.h *.m
    
    HIDE_UNDOC_MEMBERS     = YES
    HIDE_UNDOC_CLASSES     = YES
    HIDE_UNDOC_RELATIONS   = YES
    REPEAT_BRIEF           = NO
    CASE_SENSE_NAMES       = YES
    INLINE_INHERITED_MEMB  = YES
    SHOW_FILES             = NO
    SHOW_INCLUDE_FILES     = NO
    GENERATE_LATEX         = NO
    GENERATE_HTML          = YES
    GENERATE_DOCSET        = NO
    
    EOF
    
    #  Run doxygen on the updated config file.
    $DOXYGEN $DOXYFILE
    
    # Replace the old dir with the newly generated one.
    rm -f $APIDOCDIR/*
    cp -p $DOCSET/html/* $APIDOCDIR
    cd $APIDOCDIR
    
    # Revert files that differ only in the timestamp.
    svn diff *.html | diffstat | awk '$3 == 2 { print $1 }' | xargs svn revert
    
    # Add/remove files from subversion.
    svn st | awk '
        $1 == "?" { print "svn add", $2 }
        $1 == "!" { print "svn delete",  $2 }
    ' | sh -
    
    svn propset svn:mime-type text/html *.html
    svn propset svn:mime-type text/css *.css
    svn propset svn:mime-type image/png *.png
    svn propset svn:mime-type image/gif *.gif
    

提交回复
热议问题