Mac OS X - 调用嵌套Shell&来自Swift Cocoa桌面应用程序的Ruby脚本

时间:2016-02-18 12:43:23

标签: swift macos bash cocoa nstask

我正在尝试使用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 ;

0 个答案:

没有答案