我是Windows上的Ruby程序员,他试图从Win cmd切换到Cygwin,但无法实现执行Ruby gem的批处理文件。
我已将任何bin目录填入Windows PATH
env。变量,包括存储可执行文件的Ruby bin。但是,宝石由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不要处理批处理文件?
答案 0 :(得分: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'
答案 1 :(得分: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
答案 2 :(得分:1)
你正试图混合那些期望与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/