有哪些好的 Xcode 脚本可以加快开发速度?

2024-01-28

Xcode 允许您创建自动化脚本来执行重复任务。您编写了哪些脚本来加快开发速度?


我为我创建了三个适用于 Cocoa 和 iPhone 的 JSON.Framework http://code.google.com/p/json-framework/。这些负责处理以下事项:

  • 创建带有动态嵌入式框架、自定义 iPhone SDK、API 文档和一些文档文件的发行磁盘映像。
  • 在源上运行 Doxygen 以创建与 Xcode 兼容的文档集并安装它。这意味着当您在 Xcode 文档搜索中搜索内容时,也可以找到您的文档。
  • 在源代码上运行 Doxygen 以更新源代码树本身中 API 文档的签入版本。如果您使用 Subversion(它假定),那么这非常简洁,因为您所在分支的文档始终是最新的。例如,如果您托管在 Google Code 上,那就太好了。

请注意下面一些硬编码的项目特定值。我不想通过编辑脚本来破坏脚本。这些是从 Xcode 中的自定义脚本阶段启动的。您可以看到它们如何集成到上面链接的项目的 Xcode 项目中。

创建磁盘映像.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 <<HTML > $DISK_IMAGE/Documentation.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script type="text/javascript">
<!--
window.location = "Documentation/index.html"
//-->
</script>
</head>
<body>
<p>Aw, shucks! I tried to redirect you to the <a href="Documentaton/index.html">api documentation</a> but obviously failed. Please find it yourself. </p>
</body>
</html>
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

安装文档.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 <<EOF >> $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 <<EOF > $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

重新生成文档.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 <<EOF >> $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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有哪些好的 Xcode 脚本可以加快开发速度? 的相关文章

随机推荐

  • 在 Vaadin 14 应用程序的服务器端通过 Java 获取用户 Web 浏览器的 IP 地址

    In 瓦丁流 https en wikipedia org wiki Vaadin Vaadin Flow 比如14 1版本 如何获取IP地址 https en wikipedia org wiki IP address用户的网络浏览器通过
  • python:生成器对象的属性

    是否可以在生成器对象上创建属性 这是一个非常简单的例子 def filter x for line in myContent if line x yield x 现在假设我有很多这样的过滤器生成器对象漂浮在周围 也许其中一些是匿名的 我想稍
  • 使用 awk 将大型复杂的一列文件拆分为多列

    我有一个由某些商业软件生成的文本文件 如下所示 它由括号分隔的部分组成 每个部分都有数百万个元素 但具体值因情况而异 1 2 3 11 22 33 111 222 333 我需要实现如下输出 1 11 111 2 22 222 3 33 3
  • Request.UrlReferrer 在 Internet Explorer 7、8、9 浏览器中返回“null”

    在 Internet Explorer 7 8 9 浏览器中 C 的 Request UrlReferrer 返回 null 其原因何在 它的解决办法是什么 页面上有一些 单击此处 按钮 单击该按钮后 将在新选项卡中打开一个新的 url 页
  • 在 JQGrid 中映射 JSON 数据

    我正在使用 jqGrid 3 6 4 和 jquery 1 4 2 在我的示例中 我得到以下 json 数据格式 我想将这些 json 数据映射到 jqgrid 的行中 page 1 total 1 records 6 rows head
  • poll() 超时为 0 时会做什么?

    我正在看poll man page http man7 org linux man pages man2 poll 2 html 它告诉我的行为poll 当超时参数传入正值和负值时 它没有告诉我如果超时会发生什么0 有任何想法吗 看着epo
  • 在 Autofac 中注册异步工厂

    我有一个从存储库获取的 Wallet 类 我正在尝试在 Autofac 中正确注册两者 以便使用钱包的类可以注入正确的实例 问题是存储库使用异步方法 返回任务 Autofac 支持这种情况吗 这不起作用 cb RegisterType
  • Coverity有Rest API吗

    我想存储结果覆盖性 http www coverity com 到 InfluxDB 我想知道 Coverity 是否有 REST API 如果您只是尝试将数据转储到 InfluxDB 则可以从 REST API 卷曲数据并将生成的 jso
  • 批量将 PDF 转换为 XPS

    我正在寻找一种廉价的方法将 1300 个 PDF 文档批量转换为 XPS 文档 我知道我可以简单地以这种格式打印它们 但这需要很长时间 有没有办法在 C 中以编程方式执行此操作 根据您对廉价的定义 有以下几种选择 便宜 低于 1000 美元
  • gcc:如何正确使用 __attribute((__may_alias__)) 以避免“取消引用类型双关指针”警告

    我有一些代码使用类型双关来避免调用成员 对象 的构造函数和析构函数 除非 直到实际上需要使用该对象 它工作正常 但在 g 4 4 3 下 我收到这个可怕的编译器警告 jaf jeremy desktop g O3 Wall puns cpp
  • 汇编正确使用字/字节/字 ptr

    我正在编写一个用于汇编的小机器代码生成器 我有一个关于立即记忆指令的问题 让我们看一下这 3 个场景 add ebx 04 0x1 add ebx 04 0x4040 add ebx 04 0x401000 我所做的是通过立即常量 我检查它
  • Facebook Graph API:获取带有应用 ID 和密钥的访问令牌

    https developers facebook com docs facebook login access tokens https developers facebook com docs facebook login access
  • 无法解析 React Native 项目上的模块 redux

    自从新版本的react native 0 26 0 以来 当我初始化一个新项目时 我收到了这个错误 当我 npm 安装 redux 等其他模块时 我遇到了同样的错误 然后在运行时找不到这些依赖项 还有其他人遇到这样的问题或有任何想法吗 gt
  • 借助 TypeScript 将 Angular 2 与旧版浏览器一起使用?

    由于 Angular 2 团队使用 TypeScript 进行构建 因此是否可以假设他们可以编译可在旧浏览器上运行的 Angular 2 版本 Edit 2 Angular 团队似乎已决定支持一些非常绿浏览器 Per Brad Green
  • iPhone核心位置:计算总高程损失/增益

    我想在记录核心位置数据结束时计算总海拔损失和增益 我很难思考这个问题的数学原理 假设我从 600 英尺处开始 在跟踪过程中上下移动 我将如何计算海拔增益和损失 Ideas 如果您想分别跟踪增益和损失 请保留两个累积成员变量 netEleva
  • PreferredContentSize 不缩小

    我使用 UIPopoverController 弹出窗口 我使用 PreferredContentSize 来设置大小 然后 我使用 Push 一个更大尺寸的新视图控制器 当子视图弹出时 我喜欢将窗口恢复到原始大小 但好像不行 我已经把 s
  • ZetPDF - 有人知道这个产品的背景吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 问题 ZetPDF 只是伪装的 PDFSharp 吗 这个产品会继续存在吗 ZetPDF 是谁 我们目前正在使用 PDFSharp 从头开
  • 实体框架复杂类型与创建新实体

    我正在阅读有关实体框架 4 0 的内容 我想知道为什么我应该创建一个复杂类型而不是一个新的实体 表 以及它们之间的关系 完美的例子就是地址 使用复杂类型作为地址比处理新实体要容易得多 对于复杂类型 您不必处理主键 考虑访问一个地址 有多少种
  • 仅在 Firefox 上跨源请求和混合内容

    我正在开发一个需要 HTTPS 的项目 因此我使用自签名证书启动 HTTPS 服务器 我还有一个启用了 CORS 的 HTTP API 服务器 我能够在 Chrome 上获取 API 请求 这里是预检响应的标头 带有 HTTP 状态代码 2
  • 有哪些好的 Xcode 脚本可以加快开发速度?

    Xcode 允许您创建自动化脚本来执行重复任务 您编写了哪些脚本来加快开发速度 我为我创建了三个适用于 Cocoa 和 iPhone 的 JSON Framework http code google com p json framewor