我想用swift替换我的CI bash脚本.我无法弄清楚如何调用普通的终端命令,如ls
或xcodebuild
#!/usr/bin/env xcrun swift
import Foundation // Works
println("Test") // Works
ls // Fails
xcodebuild -workspace myApp.xcworkspace // Fails
Run Code Online (Sandbox Code Playgroud)
$ ./script.swift
./script.swift:5:1: error: use of unresolved identifier 'ls'
ls // Fails
^
... etc ....
Run Code Online (Sandbox Code Playgroud) 看起来xcode的$ PATH环境设置与我的用户shell环境不同.
xcode从哪里获取$ PATH设置以及追加到搜索路径的最佳方式是什么?
在xcode中,我有一个运行ruby脚本的"运行脚本"构建阶段.但是,似乎xcode正在尝试使用默认的mac 1.8版本的ruby而不是最新版本来运行它.鉴于该脚本需要一个gem,它失败并出现require错误并且错误中的路径指向
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/
显然,那条道路上的1.8让我怀疑.
如果我打开终端并运行命令,ruby -v
那么它正确返回2.0.0p0
我安装的并使用RVM设置为默认值.
我如何让Xcode在正确的位置看?或者我错误地解释了这个错误?
更新:
为了提供更多信息,这里是编译器抛出的确切错误:
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- json (LoadError)
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require'
from /Volumes/Macintosh HD/Documents/Projects/WesternMusicElements/WesternMusicElements/Ruby/NoteCollectionParser.rb:9
Command /bin/sh failed with exit code 1
Run Code Online (Sandbox Code Playgroud) 好.有关此问题的堆栈溢出有几个问题.这个问题是最接近地雷的唯一问题,但它使用通知.
代码很简单.创建一个新的空Mac OSX项目,只需在applicationDidFinishLaunching:
方法中粘贴以下代码即可.它应该获取任何可执行文件的路径(在本例中为GIT).
NSTask *aTask = [[NSTask alloc] init];
NSPipe *outputPipe = [NSPipe pipe];
NSPipe *errorPipe = [NSPipe pipe];
[aTask setStandardOutput: outputPipe];
[aTask setStandardError: errorPipe];
[aTask setArguments:[NSArray arrayWithObject:@"which"]];
[aTask setLaunchPath:@"/usr/bin/git"];
NSFileHandle *outputFileHandler = [outputPipe fileHandleForReading];
NSFileHandle *errorFileHandler = [errorPipe fileHandleForReading];
[aTask launch];
[aTask waitUntilExit];
// Task launched now just read and print the data
NSData *data = [outputFileHandler readDataToEndOfFile];
NSString *outPutValue = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSData *errorData = [errorFileHandler readDataToEndOfFile];
NSString …
Run Code Online (Sandbox Code Playgroud) 简单的问题是:如何在Cocoa应用程序中找出可执行文件的位置.
请记住,在许多类Unix操作系统中,人们使用PATH环境为其可执行文件分配首选位置,尤其是当他们的系统中有多个版本的相同应用程序时.作为一个好习惯,我们的Cocoa应用程序应该找到它需要的可执行文件的PREFERRED位置.
例如,/ usr/bin中的Leopard默认配置中有一个SVN 1.4,你通过/ opt/local/bin上的MacPorts安装了一个更新的版本,比如SVN 1.5.3.你可以使用/etc/path.d或.bash_profile或.zshrc设置你的PATH:
export PATH =/opt/local/bin:$ PATH
因此,您可以使用新版本的svn而不是系统中的旧版本.它适用于任何终端环境.但不是在Cocoa应用程序中.据我所知,Cocoa应用程序只有一个默认的PATH环境,如下所示:
export PATH ="/ usr/bin:/ bin:/ usr/sbin:/ sbin"
默认情况下,它不会使用/etc/path.d,.bash_profile,.profile,.zshrc等中的配置.
那我们究竟怎么办?
好的,我一定遗漏了一些非常简单的东西,但这是:
如果我echo $PATH
在终端,我得到/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/drkameleon
哪个是正确的
现在,如果我运行 anNSTask
并尝试执行一个简单的 bash 脚本 ( /usr/bin/env bash myscript.sh
) 来 echo $PATH
,它会打印/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin
(我什至尝试过getenv
, 或打印整个[[NSProcessInfo processInfo] environment]
字典,但PATH
变量只是......错误)
这是怎么回事?我怎样才能访问终端中看到的真实内容 $PATH
?