2013-01-31 80 views
5

可以很容易地申报SBT管理库的依赖,如如何在SBT中切换项目和库依赖关系?

libraryDependencies ++= Seq(
"org.specs2" %% "specs2" % "1.12.2" % "test" , 
"junit" % "junit" % "4.7" % "test" 
) 

虽然它不是那么容易申报SBT项目的依赖,我也可以这样做:

object RichMath extends Build { 
    lazy val myApp = Project("RichMath", file(".")) dependsOn(richUtil) 
    lazy val richUtil = RootProject(file("../RichUtil")) 
} 

但在实践中,我通常希望之间项目模式,其中的变化是在上游项目立即可见,并库模式,在这里我必须公布修改看到他们在相关项目发生变化,因为代码成熟。

早在代码库的生活,或者当我想使跨模块的频繁变化,我不想再出版的麻烦只是上游看到的变化。但是在稳定/成熟的代码中,我想指定我所依赖的版本。

好像SBT把两个依赖的完全不同。有没有比改写我的构建定义更直接的方式来切换项目和库 - 依赖关系?

+0

也许这个问题/答案是给你一些帮助:http://stackoverflow.com/questions/14351940/setting-up-sbt-environment-to-hack-on-multiple-libraries-at-once/14352600# 14352600 – 2013-01-31 10:23:33

回答

3

我有一些情景我SBT脚本(测试,发布,制作)。例如,我从的脚本开始(从bash开始,您可能有其他环境)。这是我的动态依赖与环境变量的方面:

if (sys.env.contains("LOCAL_BUILD")) { 
    Seq[Project.Setting[_]](
    unmanagedResourceDirectories in Compile <+= baseDirectory { _/"src"/"main"/"scala" }, 
    libraryDependencies ++= { 
     Seq(
     "org.digimead" %% "digi-lib-slf4j" % "0.2.1-SNAPSHOT" % "test", 
     "org.digimead" %% "digi-lib-test" % "0.2.1-SNAPSHOT" % "test", 
     "org.scalatest" %% "scalatest" % "1.9" % "test" 
    ) 
    } 
) 
} else { 
    Seq[Project.Setting[_]](
    libraryDependencies ++= { 
     Seq(
     "org.slf4j" % "slf4j-log4j12" % "1.7.1" 
    ) 
    } 
) 
} 

正如你可以看到我可能有一个环境变量控制的单名.bst定义不同的项目设置。环境变量影响所有项目/子项目。

+0

虽然此示例仅显示环境变量正在更改的设置,但它也可以应用于原始问题。系统属性也是一个选项。也就是说,我更喜欢避免系统属性/ env变量,所以我通常在此答案中使用自定义设置。对于原始问题,在定义项目间依赖关系时,设置不可用,因此虽然env变量/属性不够优雅,但可能会变得更糟。 –

3

这两种类型的依赖关系是很不相同的处理,如果他们不就好这是真的。主要障碍是sbt在加载设置之前需要了解所有外部项目(出于各种原因)。

现在,最简单的解决方案可能是在另一个答案描述的环境变量或系统属性。展望未来,以下是非常接近SBT是可能的,但仍然需要一些更多的工作:

  1. 声明的依赖像往常一样

    libraryDependencies += "org.example" % "rich-util" % "0.1" 
    
  2. 在命令行中添加源依赖,自动重写正常依赖性的过程中

    $ sbt 
    > projects add ../RichUtil 
    

的CONV在Setting up sbt environment to hack on multiple libraries at once中描述的基于策略的方法是一种特殊情况,并且可以通过这种工作来启用。