ThisBuild和Global范围有什么区别?

时间:2013-08-17 14:16:18

标签: sbt

有人可以解释我写这两行之间的区别:

resolvers in ThisBuild ++= appResolvers

resolvers in Global ++= appResolvers

2 个答案:

答案 0 :(得分:25)

阅读Scopes以获取完整说明。

我会引用相关部分:

  

有三个范围轴:

     
      
  • 项目
  •   
  • 配置
  •   
  • 任务
  •   
     

按项目轴确定范围

     

如果您将多个项目放在一个构建中,则每个项目都需要自己的设置。也就是说,键可以根据项目确定范围。

     

全球范围

     

每个示波器轴都可以使用轴类型的实例填充(例如,可以使用任务填充任务轴),或者可以使用特殊值Global填充轴。

     

在运行sbt

时引用范围键      

*可以针对每个轴显示,指的是Global范围。

     
      
  • {.}/test:full-classpath将项目轴设置为“整个构建”,其中构建为{.}。可以在Scala代码中将{.}写为ThisBuild
  •   
     

参考构建定义中的范围

name in Global := "hello"
     

name in Global隐式将范围轴Global转换为范围,所有轴都设置为Global;默认情况下,任务和配置已经Global,所以这里效果是使项目Global,即定义*/*:name而不是{file:/home/hp/checkout/hello/}default-aea33a/*:name

如上所述,Global将所有三个轴设置为Global,而ThisBuild仅将项目轴设置为{.}。如果将ThisBuild与其他轴配置相结合,这可能有意义:

name> set name in Test in ThisBuild := "test-name"
[info] Defining {.}/test:name

答案 1 :(得分:9)

这可能会在插件中使用:

resolvers in Global ++= appResolvers

虽然这可能出现在您的构建定义中:

resolvers in ThisBuild ++= appResolvers

从而允许您覆盖插件提供的全局默认值。

在同一个构建定义中,使用其中任何一个很可能具有相同的效果,因为它们是委托列表中的底部两个。