使用NSTask执行离子构建命令 - 无法访问启动路径

时间:2015-05-21 13:34:22

标签: objective-c node.js macos ionic nstask

我正在使用具有命令行界面的Ionic。我想创建一个有助于执行某些命令的小型Mac应用程序。

在终端I cd Users/me/Desktop/Repos/ionic-project/myApp 改变后,我会... ionic run

NSTask *task = [[NSTask alloc]init];

task.launchPath = @"/bin/bash";
task.currentDirectoryPath = @"cd Users/me/Desktop/Repos/ionic-tryouts/myApp";
task.arguments = @[@"ionic run"];

[task launch];

但这让我'工作目录不存在。' 我已经在SO上阅读了相当多的主题。我的错是什么?

编辑:

感谢Christik的详细解答。我现在有了这段代码:

NSTask *task = [[NSTask alloc]init];
task.launchPath = @"/usr/local/bin/ionic";
task.currentDirectoryPath = @"/Users/me/ionic-tryouts/myApp";
task.arguments = @[@"run"];

[task launch];

现在我收到以下错误:env:node:No such file or directory。我想这来自一个问题,即找不到node.js(离子是在节点之上构建的)。我发现this问题 - 缺少正确名称的符号链接可能是原因。但是为节点设置符号链接没有帮助。有什么想法吗?

EDIT2: 我给了Christik正确的答案,即使我最终无法让它工作。我还在调查。也许这是节点安装错误。

EDIT3: 我看到一些帖子提到它可能会更好,如果由homebrew重新安装节点,因为自制程序安装它没有sudo。简短评论:没有帮助

2 个答案:

答案 0 :(得分:3)

如果您想使用bash启动ionic,那么您需要执行的等效命令是/bin/bash -c ionic run,因此您需要更改以下:

  1. cd中删除前导currentDirectoryPath(可能是来自终端的副本+粘贴的拼写错误)并添加前导/以获得绝对路径
  2. arguments更改为@[@"-c",@"ionic",@"run"],因为NSTask的每个参数都应代表数组的项目。
  3. 如果由于找不到其他工具而导致/usr/bin/bash出现问题,您可以尝试使用/bin/sh

    更新由于Aditya Vaidyam指出here,您可能还需要设置环境变量(尤其是PATH一个),以模拟相同的条件对于终端。如果要查找设置了哪些环境变量,只需运行env命令。

答案 1 :(得分:3)

除了Cristik建议的内容之外,你需要添加environment variables(即PATH),即node.js的位置,除非它已经在/ usr / bin /中。