scala – SBT多项目构建与动态外部项目?
发布时间:2020-12-16 18:48:36 所属栏目:安全 来源:网络整理
导读:假设我们有一个SBT项目栏,它依赖于一些神器foo: val bar = Project('bar',file('.')).settings( libraryDependencies += "com.foo" % "foo" % "1.0.0") 但是,在某些情况下,我想检查foo的来源并让SBT从我的文件系统加载源而不是已发布的工件;这样,我可以对fo
假设我们有一个SBT项目栏,它依赖于一些神器foo:
val bar = Project('bar',file('.')).settings( libraryDependencies += "com.foo" % "foo" % "1.0.0" ) 但是,在某些情况下,我想检查foo的来源并让SBT从我的文件系统加载源而不是已发布的工件;这样,我可以对foo进行本地更改,并立即用bar测试它们,而不必发布任何内容. val foo = Project('foo',file('foo')) val bar = Project('bar',file('.')).dependsOn(foo) 我们在bar的根文件夹中有一个spec.json文件,它已指定foo是应该从源使用还是作为工件使用.有没有办法设置我的构建来读取此文件并根据spec.json中的值添加dependsOn或libraryDependencies? “ 为libraryDependencies做这个很容易: val bar = Project('bar',file('.')).settings( libraryDependencies ++= if (containsFoo(baseDirectory.value / "spec.json")) { Seq() } else { Seq("com.foo" % "foo" % "1.0.0") } ) 但是,我们找不到任何设置在dependsOn中做任何“动态”的方法,比如读取baseDirectory SettingKey. 解决方法
我们尝试了一些方法,但是我们唯一可以开始工作并且感觉不是难以理解/不可维护的黑客的方法是添加一个隐式类,它向Project添加一个方法,可以在本地或作为工件添加依赖项.
伪代码大纲的实现: implicit class RichProject(val project: Project) extends AnyVal { def withSpecDependencies(moduleIds: ModuleID*): Project = { // Read the spec.json file that tells us which modules are on the local file system val localModuleIds = loadSpec(project.base / "spec.json") // Partition the passed in moduleIds into those that are local and those to be downloaded as artifacts val (localModules,artifactModules) = moduleIds.partition(localModuleIds.contains) val localClasspathDependencies = toClasspathDependencies(localModules) project .dependsOn(localClasspathDependencies: _*) .settings(libraryDependencies ++= artifactDependencies) } } 实际SBT构建中的使用模式非常简单: val foo = Project("foo",file("foo")).withSpecDependencies( "com.foo" % "bar" % "1.0.0","org.foo" % "bar" % "2.0.0" ) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |