RubyGems + Cygwin:ruby.exe找不到POSIX路径

cri*_*spy 14 ruby bash cygwin rubygems

我是Windows上的Ruby程序员,他试图从Win cmd切换到Cygwin,但无法实现执行Ruby gem的批处理文件.

我已经将任何bin目录填入Windows环境PATH.变量,包括存储可执行文件的Ruby bin.但是,gem由ruby.exe本身调用,这会导致POSIX路径出现以下问题:

duddle@duddledan /cygdrive/c/Ruby/ruby-186-398/bin
$ gem -v
C:\Ruby\ruby-186-398\bin\ruby.exe: No such file or directory -- /cygdrive/c/Ruby/ruby-186-398/bin/gem (LoadError)

duddle@duddledan /cygdrive/c/Ruby/ruby-186-398/bin
$ ./gem --version
1.3.7
Run Code Online (Sandbox Code Playgroud)

./gem通过指定路径直接调用eg时,可以找到并执行它.

有任何想法吗?

编辑:

如何告诉cygwin不要处理批处理文件?

Rob*_*ler 59

你可以将Cygwin与MingW32 Ruby混合搭配,如果你小心并且有很好的理由这样做.与MSYS相比,Cygwin提供了更加丰富的CLI环境,但Cygwin捆绑的Ruby比MingW32版本慢得多.诀窍是在Cygwin .bashrc中为所有RubyGem包装器设置别名.这是我的一个片段.

alias gem='gem.bat'
alias rake='rake.bat'
alias erb='erb.bat'
alias irb='irb.bat'
alias rdoc='rdoc.bat'
alias ri='ri.bat'
alias rspec='rspec.bat'
alias cucumber='cucumber.bat'
alias bundle='bundle.bat'
Run Code Online (Sandbox Code Playgroud)

  • 这才是真正的答案.非常感谢!我只是让我的环境工作得很好,所以我将能够放弃windows cmd.exe shell. (5认同)

Nic*_*ich 18

诀窍是.bat像罗伯特在他的回答中指出的那样对所有文件进行别名.

为你.bashrc.zshrc之后添加一个新的别名gem install虽然不好玩......

因此,我通过扫描Ruby的bindir 自动创建这些别名:

if [[ -n "$(which ruby 2>/dev/null)" ]]; then
  RUBY_BIN=$(cygpath -u $(ruby -e 'puts RbConfig::CONFIG["bindir"]') | tr '\r' ' ')
  for f in $(find ${RUBY_BIN} -regex ".*bat$"| xargs -n1 basename); do
      alias ${f%.bat}=${f}
  done
fi
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!但我认为第二个字符串应该是RUBY_BIN = $(cygpath -u $(ruby -e'put RbConfig :: CONFIG ["bindir"]')| tr -d'\ r') (3认同)

Lui*_*ena 1

您正在尝试将需要本机路径的批处理文件与 Cygwin 混合,而 Cygwin 完全不喜欢它。

当您调用 ./gem 时,您将调用 ruby​​ 脚本,但使用 ./gemPATH则调用批处理文件。

要么告诉 cygwin 不要处理批处理文件(不知道如何处理),要么使用 MSYS Bash(如果您想要替换 cmd.exe),但不要将 Cygwin 与本机 Ruby 混合。

我过去写过关于混合和匹配的博客:

http://blog.mmediasys.com/2008/10/27/handy-tip-dont-mix-one-click-installer-with-cygwin/