ruby 如何在Rake中获取当前命名空间?

oaxa6hgo  于 2022-12-12  发布在  Ruby
关注(0)|答案(4)|浏览(116)
namespace :baseline do
  INDEX_DIR = index(:baseline) # context
  task(:foo) ...
end

如何在此上下文中获取:baseline符号?

hc8w905p

hc8w905p1#

namespace :baseline do |namespace|
  scope = namespace.instance_variable_get("@scope")

  INDEX_DIR = index(scope)

  task(:foo) ...
end
e5nqia27

e5nqia272#

现在有一种更干净的方式:

namespace :baseline do
  scope = Rake.application.current_scope
  puts scope.path
end

我需要它来定义动态任务,因此不必将命名空间传递给块是一个很大的优点。

kpbwa7wx

kpbwa7wx3#

除了Dmitris answerRake.application.current_scope

namespace :baseline do |namespace|
  scope = namespace.scope.path
  #...
end

scope将为"baseline"(字符串,而不是请求的符号)。
但是在rake中你可以用符号或字符串来定义命名空间,你也可以这样定义:

namespace 'baseline' do |namespace|
  scope = namespace.scope.path
  #...
end

两种定义的范围相同。
如果您确实需要Symbol,可以使用scope.to_sym

mdfafbf1

mdfafbf14#

多年过去了,但改进就是改进。
如果您需要Rake::NameSpace对象,但无法将名称空间对象作为参数进行访问:

... do |the_namespace|

end

您可以这样做:

scope = Rake.application.current_scope
ns = Rake::NameSpace::new Rake.application, scope

现在,ns对象将为您提供ns.tasks等方法。

相关问题