为什么需要脚本
有些时候,需要在编译完成时自动做一些工作,如果你会写shell脚本(就是命令行脚本),可以添加进某个Target让它自动执行.
哪里添加脚本
Project-Target-Build Phases-"+"-New Run Script Phases
凡是通用的shell命令行都可以用
脚本可以完成的常见工作
- 拷贝一些资源
- 检查一些选项
例如我在文章#使用Bundle打包图片配合静态库使用#中,假设静态库的Project和主工程在一个WorkSpace,不想每次更改Resource里的图片都手动重新拷贝到主工程里(不然主工程里还是旧的图片),就可以通过脚本完成.
进行Bundle拷贝脚本
脚本1 这个脚本在编译时有效,打包的时候发现拷贝不进去,造成IPA包中无Resource.bundle
cp -R -f $BUILT_PRODUCTS_DIR/Resource.bundle $APP_PRODUCT_CONTENTS_FOLDER_PATH
脚本2 这个脚本在打包时有效,但是在编译时会报错,因为BUILT_PRODUCTS_DIR是个快捷方式(链接),找不到实际对象
cp -R -f $BUILT_PRODUCTS_DIR/Resource.bundle $BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/
脚本3 最终求助linux的大哥,搞了个函数,先获取Resource.bundle的实际路径,然后进行拷贝
function getRealPath()
{
[[ `ls -lt $1 | head -1|awk '{print $10}'` == "->" ]] && realPath=`ls -lt $1 | head -1|awk '{print $11}'`|| realPath=$1
echo "$1 the real directory is:$realPath"
}
getRealPath "$BUILT_PRODUCTS_DIR/Resource.bundle"
cp -R -f $realPath $BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/
脚本四 后来读了读Pods脚本,发现Pods有更好的RealPath的脚本
realpath() {
DIRECTORY="$(cd "${1%/*}" && pwd)"
FILENAME="${1##*/}"
echo "$DIRECTORY/$FILENAME"
}
ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1")