注意到任何Typesafe Activator模板中都有两个name
设置 - 一个位于build.sbt
,另一个位于activator.properties
。
有没有办法让一个人依赖(使用另一个的价值)?虽然构建版本name
可以默认为主项目文件夹的名称,但我不确定激活器的名称。
答案 0 :(得分:0)
您可以使用您想要使用的任何scala代码来build.sbt
写出或修改activator.properties
。
但是你仍然需要检查activator.properties
到git,因为Activator模板发布系统没有在项目上运行sbt,它只是查看git中的文件。
而且,针对最终用户的最佳模板最终会在其中生成一些无关的构建代码以生成activator.properties
,这会使示例变得混乱。
你可以尝试另一种方式,但我认为它不会起作用。
在sbt中,name
是一个设置而不是一个任务,因此只评估一次 - 所以如果你从activator.properties
读取它,你需要重启(或者至少重新加载)编辑activator.properties
时你的sbt构建。但您可以使用您喜欢的任何scala代码从activator.properties
读取。类似的东西:
name := {
val props = new java.util.Properties()
props.load(new java.io.FileReader(file("activator.properties")))
props.getProperty("name")
}
但是,这有两个原因会失败。
最终用户实例化(克隆)模板时:
因此,在克隆时,首先上面的代码会由于缺少activator.properties
而失败,其次用户的所选名称将不会被交换(因为上面的表达式对于激活器而言太复杂了找出如何更换它。)
此名称替换意味着您的build.sbt
名称在大多数情况下都会被删除。一个例外是用户下载"模板包" (来自项目的预先克隆的zip)来自typesafe.com上的模板详细信息页面,然后保留build.sbt
中的名称。
请注意,如果您更改了activator.properties
中的名称,那么您最终会复制模板(您实际上是在发布新模板),因此您可能不想抽象这个无论如何 - 只有在创建新模板时才应该更改它。
也许底线是KISS - 在两个地方写下名字。替代方案都会引起麻烦。
我能想到的唯一方法就是在生成模板的模板中有一些代码在之外。我认为,Akka和Play都会为更大的akka和播放源树的一部分模板做这件事。但在这一点上,你肯定做的工作比我做的更多,只是为了避免复制一个名字串,你想要有其他理由去那里。