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

Posted

技术标签:

【中文标题】使用 NSTask 执行离子构建命令 - 无法访问启动路径【英文标题】:Using NSTask to execute ionic build commands - launch path not accessible 【发布时间】:2015-08-03 05:08:55 【问题描述】:

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

在终端我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 的主题。我的错误是什么?


编辑:

感谢克里斯蒂克的详细回答。我现在有这个代码:

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 问题 - 缺少正确名称的符号链接可能是原因。但是为节点设置符号链接并没有帮助。有什么想法吗?


编辑2: 我给了克里斯蒂克正确的答案,尽管我最终无法让它发挥作用。我还在调查。可能是节点安装错误。


编辑3: 我看到一些帖子提到它可能会更好,如果 node 由 homebrew 重新安装,因为 homebrew 在没有 sudo 的情况下安装它。简短评论:没有帮助

【问题讨论】:

【参考方案1】:

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

    currentDirectoryPath 中删除前导cd(这可能是从终端复制+粘贴的拼写错误)并添加前导/ 以获得绝对路径 将arguments更改为@[@"-c",@"ionic",@"run"],因为 NSTask 的每个参数都应该代表数组中的一项。

如果您在使用/usr/bin/bash 时遇到一些其他工具未找到的问题,您可以尝试使用/bin/sh

更新正如Aditya Vaidyam 指出的here,您可能还需要设置环境变量(尤其是PATH),以模拟与终端相同的条件。如果你想知道设置了哪些环境变量,只需运行envcommand。

【讨论】:

感谢您的回答,但如上所述,我仍然遇到问题。我会设置一个赏金;-) 感谢您的关注 :-) 但即使只有@[@"run"] 作为参数,它也会给出env: node: No such file or directory。我想这与离子安装有关 您找到解决方案了吗?我在使用 NSTask 运行 Gulp 时遇到了同样的问题。 @Cristik 感谢您的回复;我确信论点通过了;看看我是否在终端上运行特定命令,例如'class-dump -H -o ' 它可以工作并将头文件制作到 ;但是对于 NSTask,我对上面建议的代码做同样的事情。它给出了错误“/bin/sh: class-dump: No such file or directory”。 怎么做? @克里斯蒂克【参考方案2】:

在 Cristik 建议的基础上,您需要将 node.js 的位置添加到 environment variables(即 PATH),除非它已经在 /usr/bin/ 左右。

【讨论】:

以上是关于使用 NSTask 执行离子构建命令 - 无法访问启动路径的主要内容,如果未能解决你的问题,请参考以下文章

离子构建失败 CompileAssetCatalog

离子 ios 应用程序无法访问互联网

无法完成离子电容器添加android命令

离子可选:错误 TS1086:无法在环境上下文中声明访问器

是否会被 MAS 拒绝使用 NSTask 和 open 命令打开 Safari 或其他应用程序

无法在终端中构建应用程序,只能使用 Android Studio。 (离子,科尔多瓦)