在 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/
.
因此:
- 在位于
~/.rake/cwd.rake
的文件中定义您的 :cwd
任务。
- 运行
rake --system cwd
这应该 运行 当前工作目录中的 :cwd
任务。
我在 /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/
.
因此:
- 在位于
~/.rake/cwd.rake
的文件中定义您的:cwd
任务。 - 运行
rake --system cwd
这应该 运行 当前工作目录中的 :cwd
任务。