我正在尝试使用Swift为Mac OS X [El Capitan 10.11.1]构建一个GUI应用程序[swift --version打印: Apple Swift 1.2版(swiftlang-602.0.53.1 clang-602.0) .53)],它可以使用我的shell和ruby脚本。
我遇到的问题是当我使用NSTask和NSBundle.mainBundle()。pathForResource运行脚本(.sh或.rb)时,被调用的脚本没有看到来自的脚本同一目录。当我使用硬编码的外部设备时,它可以正常工作。目录,但这不是一个选项,因为脚本必须是最终构建的一部分。
我也尝试过使用相对路径,例如' ./ Contents / Resources /... 39;哪个没用。
(相关代码如下。我希望它足够了。另外,作为补充信息,我不是一个经验丰富的程序员,而且我对Mac,Bash&amp相当新(大约三个月) ; Ruby和非常新的(如本周开始的)到Xcode 6.4,Swift& Cococa并且从未使用过Objective-C,因此对于糟糕的风格和/或非常基本的错误表示歉意)
Swift Code:
class ShellTask {
var filePath: String
var arguments: [String]
init(filePath: String, arguments: [String]) {
self.filePath = filePath
self.arguments = arguments
}
func run() {
let task = NSTask()
task.launchPath = filePath
task.arguments = arguments as [String]
task.launch()
task.waitUntilExit()
}
}
class ViewController: NSViewController {
let shellTask = ShellTask(filePath: "", arguments: [""])
@IBAction func buttonDebug(sender: AnyObject) {
let mainBundle = NSBundle.mainBundle()
let resourceDataPath = mainBundle.pathForResource("test", ofType: ".sh")
shellTask.setFilePath(resourceDataPath!)
shellTask.run()
}
Shell / Ruby Code I目前用于测试(实际脚本太多,无法立即发布):
test.sh(入口点):
#!/usr/bin/env bash
WORKDIR=$(dirname $0)
cd "$WORKDIR"
echo "from: test.sh"
ruby test1.rb
exit
test1.rb:
#!/usr/bin/env ruby
require './test2'
def test1()
puts "from: test1.rb"
end
test1()
test2()
test2.rb:
#!/usr/bin/env ruby
def test2()
puts "from: test2.rb"
end
从终端运行test.sh时的输出:
<user>$ bash test.sh
from: test.sh
from: test1.rb
from: test2.rb
从Cocoa应用程序运行时的输出:
ruby: No such file or directory -- test1.rb (LoadError)
过去两天我一直在尝试多种方法并阅读多个帖子,但无法找到解决方案。但是在使用硬编码路径时它没有问题,例如&#39; / User / user /Documents/Testfiles/test.sh'。
此外,如果Xcode终端没有从测试文件中打印任何内容,它只需要找到它们即可。对于实际程序,ruby脚本只需要使用不同文件中的模块中的函数,这些函数在几个脚本中是必需的,因此在以后需要进行更改时,在每个被调用脚本中对它们进行复制粘贴会非常烦人。 。但肯定的是,必须有一种方法可以让它在这里运行:/
提前致谢
EDIT1: 使用NSFileManager.defaultManager()。currentDirectoryPath的相对路径,然后添加资源文件夹的路径(&#39; /Contents/Resources/test.sh')会导致错误的启动路径无法访问&#39 ;