最近在工作中,我们遇到了Puppet中的错误。我决定在空闲时间尝试修复bug。这个过程的第一步是让它使用git克隆工作。我按照说明进行操作,然后尝试使用rake,我开始收到此错误:
PS C:\Puppet-Code\Puppet> rake
rake/gempackagetask is deprecated. Use rubygems/package_task instead
The system cannot find the path specified.
rake aborted!
No such file or directory - pwd
(See full trace by running task with --trace)
我用--trace运行它得到了这个:
PS C:\Puppet-Code\Puppet> rake --trace
rake/gempackagetask is deprecated. Use rubygems/package_task instead
The system cannot find the path specified.
rake aborted!
No such file or directory - pwd
ext/packaging/tasks/00_utils.rake:198:in ``'
ext/packaging/tasks/00_utils.rake:198:in `get_pwd_version'
ext/packaging/tasks/00_utils.rake:171:in `get_dash_version'
ext/packaging/tasks/10_setupvars.rake:65:in `<top (required)>'
C:/Puppet-Code/Puppet/Rakefile:25:in `load'
C:/Puppet-Code/Puppet/Rakefile:25:in `block in <top (required)>'
C:/Puppet-Code/Puppet/Rakefile:25:in `each'
C:/Puppet-Code/Puppet/Rakefile:25:in `<top (required)>'
C:/Ruby193/lib/ruby/1.9.1/rake/rake_module.rb:25:in `load'
C:/Ruby193/lib/ruby/1.9.1/rake/rake_module.rb:25:in `load_rakefile'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:501:in `raw_load_rakefile'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:82:in `block in load_rakefile'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:81:in `load_rakefile'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:65:in `block in run'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:63:in `run'
C:/Ruby193/bin/rake:32:in `<main>'
在查看文件后,我发现这就是问题所在:
%x{pwd}.strip.split('.')[-1]
我正在使用Powershell运行rake文件,当我直接在Powershell中运行pwd时,它可以运行。但是,如果我使用%x {pwd}在irb中运行它,我只会收到一条错误消息,指出没有这样的文件或目录'pwd'。我的理解是%x只是将该命令传递给shell(我认为它是Powershell,因为那是我运行它的地方)。
任何人都可以解释为什么%x {pwd}无法正常工作以及我可以做些什么来修复它?
编辑:我在Windows上使用Powershell。
感谢。
答案 0 :(得分:3)
在Ruby中,默认情况下反引号,%x
,system
或exec
将无法在PowerShell下运行。
在Windows上,即使您在另一个shell中启动进程,subshell,irb等,所有系统命令也将在cmd.exe
下运行。没关系 - Ruby总是会生成cmd.exe
来运行任何系统命令。
来自Kernel.exec
的文档:
标准shell在类Unix系统上总是表示“/ bin / sh”,与ENV [“RUBYSHELL”](或Windows NT系列上的ENV [“COMSPEC”])相同,类似。
您可以尝试更改RUBYSHELL
或COMSPEC
以引用PowerShell,但是您可能很难让它工作。
相反,我会尝试其他解决方案,例如找到在pwd
下运行的等效cmd.exe
命令并使用它。
或者为什么不使用Dir.pwd
。
答案 1 :(得分:2)
不要依赖shell来为您提供当前的工作目录,而是使用Dir#pwd。例如:
directory = Dir.pwd
或者,如果您真的想要使用Windows shell,可以查看this older question.但是,与操作系统无关的方法通常更为健全。
给定 C:\ tmp \ foo.bar 的当前工作目录,Dir模块应该产生以下结果:
Dir.pwd.strip.split('.')[-1]
# => "bar"
假设“bar”确实是你正在寻找的字符串,一切都应该是好的。如果您正在做一些更复杂的事情,您可能需要更新您的问题。
答案 2 :(得分:0)
将评论重新发布并扩展为可能的答案。如果您使用的是Windows,则pwd
无法作为评论。您需要使用cd
或echo %cd%
:
Windows equivalent to UNIX pwd
在上述帖子中不要错过这个答案:
https://stackoverflow.com/a/4634089/417194
以管理员身份打开记事本并写下:
@echo %cd%
将其保存在c:\ windows \ system32 \中,名称为“pwd.cmd”(注意不要保存pwd.cmd.txt)
然后你有了pwd命令。
还有内置的ruby功能: