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

我是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 

当通过指定路径直接调用例如./gem ,可以找到并执行它。

有任何想法吗?

编辑:

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

你试图混合那些期望与Cygwin本机路径的批处理文件,这完全不喜欢它。

当你调用./gem时,你正在调用ruby脚本,但使用PATH正在调用批处理文件。

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

我在过去写过有关混音和匹配的博文:

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

你可以将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' 

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

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

因此,我通过扫描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