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

5

从终端打开Xcode项目很容易:

open Foo.xcodeproj/

但它只是打开项目并恢复其先前的状态,使用UserInterfaceState.xcuserstate - 所以它只会打开你最后编辑的活动文件。

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

我尝试过的:

  1. 编辑.xcuserstate - 噩梦,不要这样做。
  2. 运行open Foo/Foo.xcodeproj/然后 open Foo/Sources/main.swift,这在一些时候可以工作,但并不总是如此。(如果你刚生成项目并这样做了,它会打开项目,然后在一个单独的窗口中打开文件。)

还有其他的想法吗?


有趣的问题。麻烦出现在最后打开需要加载一段时间的文件,比如xib或storyboard上。如果是这种情况,那么当Xcode正在忙于加载xib时,如果你要求它打开另一个项目文件,它会在新窗口中打开新文件。如果它没有在现有窗口中加载,它会在现有窗口中打开新文件。我已经把这个问题添加到我的WWDC提问列表中了。 - rob mayoff
@robmayoff 您的描述更准确——如果Xcode在执行第二个“open”时仍在加载第一个文件,则会在新窗口中打开第二个文件。否则,它将在现有编辑器中打开第二个文件。如果您能在WWDC期间找到答案,我会非常感激! man open 显示您可以在 --args 后面传递参数给应用程序。我想问一下Xcode是否有任何启动参数来指定活动文件路径。 - Clay Ellis
1个回答

1
一个名叫Mike的Xcode工程师向我介绍了Xcode的工作区文档脚本类中的"loaded"属性。通过轮询此属性,我们可以等待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将在现有项目窗口的编辑器中打开源文件。

非常好!非常感谢您利用WWDC得到这个答案!向您致敬并表示感谢。 - Clay Ellis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接