在 ruby 中从终端 (bash) 获取 cwd

Get cwd from terminal (bash) in ruby

我在 /Users/dru/repo 中有一个 Rakefile,我想 运行 从终端的当前工作目录中执行一个 rake 任务。

例如,如果我被 cd 进入 /Users/dru/repo/cookbooks/mybook 并且我 运行 rake cwd,我想获得我被 cd 进入的目录而不是 /Users/dru/repo,这是目前正在发生的事情,因为那是 Rakefile 所在的地方。

我想做的是 运行 knife cookbook test mybook.

desc "Run rspec from terminal's cwd"
task :cwd do
  cwd = (/[^\/]+$/).match(Dir.pwd)
  sh "bundle exec knife cookbook test #{cwd}"
end

这个 运行s bundle exec knife cookbook test repo 但我想 运行 bundle exec knife cookbook test mybook 如果我被 cd 到那个目录。

我最后做了什么

马特·布里克森 (Matt Brictson) 的回答让我了解了我一直在寻找的解决方案,并且最终完美运行。

在我的 create_project 任务中,我添加了:

File.open("#{TOPDIR}/cookbooks/#{args.name}/Rakefile", "w") do |rake|
  rake.puts "load '../../Rakefile'"
end

它在每个食谱的根目录下放置一个 Rakefile,从工作区的根目录加载 Rakefile。

如果我没有误会你的话,我想你可以将你当前的位置作为参数传递。像这样:

desc "Run rspec from terminal's cwd"
task :cwd, [:arg1] do |t, args|
  cwd = (/[^\/]+$/).match(args[:arg1])
  sh "bundle exec knife cookbook test #{cwd}"
end

然后 运行 来自 shell:bundle exec rake "cwd[$(pwd)]"

正如您所发现的,rake 的默认行为是搜索 Rakefile,然后切换到 Rakefile 所在的目录。您可以在 rake/application.rb

中查看执行此操作的代码

为避免这种情况,您可以使用 --system 标志 运行 在 "system wide" 模式下耙。这将改变 rake 的行为,使其不再搜索 Rakefile。相反,它会在全局 rakefiles 位置中查找名为 *.rake 的文件,通常是 ~/.rake/.

因此:

  1. 在位于 ~/.rake/cwd.rake 的文件中定义您的 :cwd 任务。
  2. 运行 rake --system cwd

这应该 运行 当前工作目录中的 :cwd 任务。