【问题标题】:RubyGems + Cygwin: POSIX path not found by ruby.exeRubyGems + Cygwin:ruby.exe 找不到 POSIX 路径
【发布时间】:2013-10-17 18:41:19
【问题描述】:

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

我已经将任何 bin 目录填充到 Windows PATH 环境中。变量,包括存储可执行文件的 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 不要处理批处理文件?

【问题讨论】:

  • 查看man cygpath 看看是否有任何帮助。
  • 如何改变另一个答案(+12 票)?
  • 我无法验证它,因为我不再使用 Windows。我们可以将其作为社区问题之类的吗?

标签: ruby bash rubygems cygwin


【解决方案1】:

如果您小心并且有充分的理由这样做,您可以将 Cygwin 与 MingW32 Ruby 混合搭配。 Cygwin 提供了比 MSYS 更充实的 CLI 环境,但 Cygwin 捆绑的 Ruby 比 MingW32 版本慢得多。诀窍是为 Cygwin .bashrc 中的所有 RubyGem 包装器起别名。这是我的一个 sn-p。

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'

【讨论】:

  • 这才是真正的答案。非常感谢!我刚刚让我的环境运行良好,所以我可以放弃 windows cmd.exe shell。
  • 我同意这个修复是这个问题(刚才让我头疼)但我认为 Luis 有真正的答案。在下一个问题之前,这些只是权宜之计。
  • 我发现添加alias compass='compass.bat'也很有用
【解决方案2】:

正如罗伯特在回答中指出的那样,诀窍是为所有 .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

【讨论】:

  • 谢谢!但我认为第二个字符串应该是 RUBY_BIN=$(cygpath -u $(ruby -e 'puts RbConfig::CONFIG["bindir"]') | tr -d '\r')
  • 在我与 babun/zsh 一起使用的 windows 框中,查找失败,所以我删除了 | tr -d '\r' 块并将查找路径更改为 ${RUBY_BIN: : -1}
  • 我根据@Oswaldo 评论创建了一个 GIST。你可以在这里抓住它:gist.github.com/thomaseizinger/08d8bde9bf814ca75805d962cc101e72
【解决方案3】:

您正在尝试将期望本机路径的批处理文件与 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/

【讨论】:

  • 好的...阅读您的博文...我将如何使用捆绑的 Ruby 版本的 Cygwin...以及这样做的缺点是什么?我能否/必须在 Cygwin 环境中安装依赖本机扩展的所有其他工具? ImageMagick、nokogiri 等等等等?这会减慢速度吗?还是会遇到其他问题?
  • 是的,它会更慢,是的,你需要在 cygwin Ruby 下安装所有东西,因为编译的代码不同。
  • 一个建议是使用MSYS,因为如果你只需要bash,那么你就不需要cygwin的慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2011-08-18
  • 2013-05-27
相关资源
最近更新 更多