除非首先运行清理,否则运行ibtool会构建部分iOS构建中断

时间:2013-09-25 18:00:04

标签: ios xcode internationalization xcode5

添加了一个运行

的构建脚本步骤
ibtool ./Mobile/Base.lproj/MainStoryboard_iPad.storyboard --generate-strings-file ./Mobile/Base.lproj/MainStoryboard_iPad.strings

这无法构建

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"     "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.ibtool.errors</key>
<array>
    <dict>
        <key>description</key>
        <string>Interface Builder could not open the document "MainStoryboard_iPad.storyboard" because it does not exist.</string>
    </dict>
</array>
</dict>
</plist>
Command /bin/sh failed with exit code 1

首次清理项目然后构建项目时,它将首次成功。

我试图在示例项目中复制它,但无法复制它。我们真正的项目要复杂得多......有6种语言,项目有两个目标(一个用于企业构建,一个用于商店构建)。许多课程和两个大型故事板。

是否有人建议尝试做些不同的事情来找出导致问题的原因,以确定它是否是工具错误?

4 个答案:

答案 0 :(得分:4)

我在使用Xcode 5和常规xib文件时遇到了同样的问题。 ibtools随机工作。使用sudo终于为我做了诀窍。

以下是一个例子:

$ibtool --generate-strings-file en.lproj/MyVC.strings en.lproj/MyVC.xib
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"     
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.ibtool.errors</key>
<array>
    <dict>
        <key>description</key>
        <string>Interface Builder could not open the document "MyVC.xib" because it does not exist.</string>
    </dict>
</array>
</dict>
</plist>

每次使用sudo都有效,尽管它有时会抱怨'用户域将会不稳定'

$sudo ibtool --generate-strings-file en.lproj/MyVC.strings en.lproj/MyVC.xib
2013-10-01 10:04:35.943 Interface Builder Cocoa Touch Tool[1717:303] CFPreferences: user       
home directory at file:///var/root/Library/Application%20Support/iPhone%20Simulator/User/ is unavailable. User domains will be volatile.
$

答案 1 :(得分:1)

ibtool正在错误的目录中运行。始终使用ibtool的绝对路径,而不是相对路径。

这很奇怪,绝对是一个错误;可能是ibtool实际上正在告诉正在运行的Xcode副本来完成工作。

如果您使用ibtool --output-format human-readable-text,则错误消息包含它尝试打开的实际路径,这会显示问题。

这是一个很难排除的问题,因为OSX缺少基本工具 - 没有strace,而dtruss只能以root身份运行。

答案 2 :(得分:0)

我知道这是一个老问题,但我遇到了与故事板类似的问题并更新了我在互联网上找到的脚本,该脚本在调用ibtool时使用了故事板的完整路径。您将在下面找到脚本

#!/bin/sh
# Update storyboard string files
#
# by 2013 André Pinto andredsp@gmail.com
# based on http://forums.macrumors.com/showthread.php?t=1467446

storyboardExt=".storyboard"
stringsExt=".strings"
newStringsExt=".strings.new"
oldStringsExt=".strings.old"
localeDirExt=".lproj"
baselprojName="Base.lproj"

# Find Base internationalization folders
find . -name "$baselprojName" | while read baselprojPath
do
    # Get Base project dir
    baselprojDir=$(dirname "$baselprojPath")

    # Find storyboard file full path inside base project folder
    find "$baselprojPath" -name "*$storyboardExt" | while read storyboardPath
    do
        # Get Base strings file full path
        baseStringsPath=$(echo "$storyboardPath" | sed "s/$storyboardExt/$stringsExt/")

        # Get storyboard file name and folder
        storyboardFile=$(basename "$storyboardPath")
        storyboardDir=$(dirname "$storyboardPath")

        #Get the full path of the storyboard and the temporary string files. This is the fix for ibtool error
        storyboardFullPath=$(echo $(echo `pwd`)$(echo "$storyboardPath" | cut  -c2-))
        newBaseStringsFullPath=$(echo `pwd`"/Main.strings.new")

        echo "Full path of the storyboard $storyboardFullPath"
        echo "Full path of the temporary string files $newBaseStringsFullPath"

        # Get New Base strings file full path and strings file name
        stringsFile=$(basename "$baseStringsPath")

        # Create strings file only when storyboard file newer
        newer=$(find "$storyboardPath" -prune -newer "$baseStringsPath")
        [ -f "$baseStringsPath" -a -z "$newer" ] && {
            echo "$storyboardFile file not modified."
            continue
        }

        echo "Creating default $stringsFile for $storyboardFile..."

        ibtool --export-strings-file "$newBaseStringsFullPath" "$storyboardFullPath"
        iconv -f UTF-16 -t UTF-8 "$newBaseStringsFullPath" > "$baseStringsPath"
        rm "$newBaseStringsFullPath"

        # Get all locale strings folder with same parent as Base
        ls -d "$baselprojDir/"*"$localeDirExt" | while read localeStringsDir
        do
            # Skip Base strings folder
            [ "$localeStringsDir" = "$storyboardDir" ] && continue

            localeDir=$(basename "$localeStringsDir")
            localeStringsPath="$localeStringsDir/$stringsFile"

            # Just copy base strings file on first time
            if [ ! -e "$localeStringsPath" ]; then
                echo "Copying default $stringsFile for $localeDir..."
                cp "$baseStringsPath" "$localeStringsPath"
            else
                echo "Merging $stringsFile changes for $localeDir..."
                oldLocaleStringsPath=$(echo "$localeStringsPath" | sed "s/$stringsExt/$oldStringsExt/")
                cp "$localeStringsPath" "$oldLocaleStringsPath"

                # Merge baseStringsPath to localeStringsPath
                awk '
NR == FNR && /^\/\*/ {
    x=$0
    getline
    a[x]=$0
    next
}
/^\/\*/ {
    x=$0
    print
    getline
    $0=a[x]?a[x]:$0
    printf $0"\n\n"
}'  "$oldLocaleStringsPath" "$baseStringsPath" > "$localeStringsPath"

                rm "$oldLocaleStringsPath"
            fi
        done
    done
done

答案 3 :(得分:0)

我也收到一条消息,例如“Interface Builder无法打开文档”YourStupid.xib“因为它不存在。”

对我有用的是设置默认的Xcode。我的系统上有两个版本的Xcode,虽然我从不使用旧版本,但它仍然存在。我从下载页面安装了我的Xcodes,而不是通过App Store。我在这里谈论Xcode 5.0。要设置要使用的默认Xcode,请使用sudo运行以下命令。 xcode-select需要sudo才能运行。

sudo xcode-select -s /Applications/Xcode.app

之后我的ibtool再次工作。对我来说,它没有这里提到的sudo解决方案。

我觉得在安装文档集后出现了这个问题。在阅读了这里的一些帖子并思考发生了什么变化后,我想到了我过去使用的第一个Jenkins安装,Xcode和权限(sudo命令)时遇到的问题,并回到了这个命令。

到目前为止,这对我有用,从那以后我没有看到任何问题。您的里程可能会有所不同。