从终端打开Xcode项目很简单:
open Foo.xcodeproj/
但是,这只是打开项目并使用UserInterfaceState.xcuserstate
恢复其以前的状态 - 因此它只会打开您正在编辑的最后一个活动文件。
有没有办法打开Xcode项目 和 指定应该打开哪个文件?
我尝试过的事情:
.xcuserstate
- 噩梦,不要这样做。open Foo/Foo.xcodeproj/
然后open Foo/Sources/main.swift
,但并非总是如此。 (如果您刚刚生成项目并执行此操作,它将打开项目,然后在单独的窗口中打开该文件。)还有其他想法吗?
答案 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将在现有项目窗口的编辑器中打开源文件。