打开Xcode项目并从终端设置活动文件

时间:2017-06-03 16:59:04

标签: xcode bash terminal

从终端打开Xcode项目很简单:

open Foo.xcodeproj/

但是,这只是打开项目并使用UserInterfaceState.xcuserstate恢复其以前的状态 - 因此它只会打开您正在编辑的最后一个活动文件。

有没有办法打开Xcode项目 指定应该打开哪个文件?

我尝试过的事情:

  1. 编辑.xcuserstate - 噩梦,不要这样做。
  2. 正在运行open Foo/Foo.xcodeproj/然后open Foo/Sources/main.swift ,但并非总是如此。 (如果您刚刚生成项目并执行此操作,它将打开项目,然后在单独的窗口中打开该文件。)
  3. 还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

一位名叫Mike的Xcode工程师向我指出了Xcode的loaded脚本类的workspace document属性。通过轮询,我们可以等到Xcode完成加载项目(包括加载编辑器窗格),然后再要求它打开文件。这样可以在项目的窗口中可靠地打开文件。

这是我写的xopen脚本:

#!/bin/bash

shopt -s nullglob

sourceFile="$1"
case "$sourceFile" in
    /*) ;;
    *) sourceFile="$PWD"/"$sourceFile" ;;
esac

projectDir="$sourceFile"
while [[ $projectDir = */* ]]; do
    projectDir="${projectDir%/*}"
    candidates=("$projectDir"/*.xcodeproj)
    candidate="${candidates[0]}"
    if [[ "$candidate" != "" ]]; then
    jPath="$candidate"
    fi
done

if [[ "$jPath" = "" ]]; then
    echo 1>&2 "error: couldn't find .xcodeproj in any parent directory"
    exit 1
fi

exec osascript - "$jPath" "$sourceFile" <<EOF
on run argv
    set jPath to item 1 of argv
    set sourceFile to item 2 of argv
    tell app "Xcode"
    set wsDoc to (open jPath)
    set waitCount to 0
    repeat until wsDoc's loaded or waitCount ≥ 20
        set waitCount to waitCount + 1
        delay 1
    end repeat
    if wsDoc's loaded then
        open sourceFile
    end if
    end tell
end run
EOF

此脚本使用shell从源文件(作为命令行参数给出)向上遍历目录树,直到找到包含Xcode项目包的目录。然后它将项目的路径和源文件的路径传递给AppleScript。 AppleScript要求Xcode打开该项目。如果Xcode已经打开了项目,它就会把现有的项目窗口放在前面。

接下来,脚本会轮询Xcode,直到它报告工作区文档已加载,或者直到20秒为止。

最后,如果加载了工作区文档,它会要求Xcode打开源文件。 Xcode将在现有项目窗口的编辑器中打开源文件。