如何让xcode在运行脚本时使用正确版本的ruby?

在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 

假设您在项目中指定了rvm ruby​​版本(我认为您应该这样做),我认为这是一个比现在更普遍适用的答案。

粗略地说,在shell脚本中,你应该这样做

 # provides the rvm *function* to your shell script source "${SOMETHING}/scripts/rvm" # then, for this script, the rvm function will change to # the controlling ruby version for the pwd when this is run rvm use . 

我在这个答案中以更多生产准备细节介绍了这一点。

我使用它来使用除默认系统解释器之外的解释器来运行Xcode:

  1. 退出Xcode,如果它打开并转到您的终端。
  2. 激活您要使用的rvm。
    rvm use 2.0.0p0
  3. 然后从终端打开Xcode:
    open -a Xcode

要对此进行测试,您可以在构建中包含记录解释器版本或可用gem的内容。

如果你有Xcode打印出环境变量IIRC,Xcode设置的$PATH与你在常规终端会话中加载的$PATH不同。

这使您(至少)有两种方法可以解决问题:

  1. 您可以编辑脚本以直接指向rvm安装的ruby。 如果您的脚本必须在多个系统上工作(即使它确实违背了rvm承诺的工作方式),这可能会更好。

  2. 根据Peter Hosey对Chris Hanson在这个问题中的回答的评论,您可以在~/.MacOSX/environment.plist中设置环境变量,这些变量将适用于您启动的所有进程。

我有类似的情况,但正在运行的脚本有一个shebang线指的是系统安装的Ruby。

 #!/usr/bin/ruby 

我的解决方案可能很危险 ,就是将/usr/bin/ruby替换为RVM安装的Ruby的符号链接。

以下是我采取的步骤:

  1. 安装多用户RVM(来自https://rvm.io/rvm/install的sudo选项)
  2. 使用“设置”应用(设置>用户和组)将自己添加到rvm组。
  3. 注销并重新登录以确保操作系统遵守组成员身份。
  4. 从命令行安装我需要的gem。 由于我现在是rvm组中的RVM管理器,因此这会影响/usr/local/rvm
  5. 移动/usr/bin/ruby并将RVM默认Ruby符号链接到其位置。 (这是危险的部分。如果程序假设他们将使用系统安装的版本,则可能会导致问题。)

为了替换符号链接,我做了:

 sudo mv /usr/bin/ruby /usr/bin/system_ruby sudo ln -s /usr/local/rvm/rubies/default/bin/ruby /usr/bin/ruby 

执行此操作(当Xcode未运行时),下次我在Xcode中构建项目时,脚本使用了我用RVM安装的Ruby。

我也有这个问题,因为我想使用xcpretty。 我最终在下面做了以下指向正确的gem文件夹

 $RUBYPATH=$(eval ~/.rvm/bin/rvm info | grep "GEM_HOME:" | awk -F '"' '{print $2}') 

你想要的任何gem都将在这个文件夹中。

如果你只是想要你ruby的家庭路径:

 $RUBYPATH=$(eval ~/.rvm/bin/rvm info | grep "MY_RUBY_HOME:" | awk -F '"' '{print $2}') 

xcpretty是在bin / in我的场景中的第一个选项,如下所示。 所以对我来说,我最终做了以下事情:

 $RUBYPATH=$(eval ~/.rvm/bin/rvm info | grep "GEM_HOME:" | awk -F '"' '{print $2}') RUBY_BIN_PATH=${RUBY_PATH}"/bin/" XCPRETTY=$RUBY_BIN_PATH"xcpretty" eval $XCPRETTY 

您可以通过执行哪些操作来预先找出ruby命令的位置

你也可以rvm use system切换到默认的mac os ruby​​然后用sudo安装gems。 对我来说似乎是最容易的。