我有一个相当普通的Scala项目,目前正在使用Maven构建.我想支持Scala 2.9.x和即将推出的2.10,它不是二进制或源兼容的.如果有必要,我愿意接受转换到SBT,但我遇到了一些挑战.
我对这个项目的要求是:
单源树(无分支).我相信,尝试为每个Scala版本支持多个并发"主"分支将是错过分支之间错误修正的最快方法.
特定于版本的源目录.由于Scala版本不是源兼容的,我需要能够为版本特定的源指定辅助源目录.
特定于版本的源jar.最终用户应该能够为他们的Scala版本集成下载具有正确版本特定源的正确源jar.
集成部署.我目前使用Maven发布插件将新版本部署到Sonatype OSS存储库,并且希望为发布版本提供类似的简单工作流程.
最终用户Maven支持.我的最终用户通常是Maven用户,因此准确反映依赖关系的功能性POM至关重要.
阴影罐支持.我需要能够生成包含我的依赖项子集的JAR,并从已发布的POM中删除着色的依赖项.
我尝试过的事情:
Maven个人资料.我创建了一组Maven配置文件来控制用于构建Scala的版本,使用Maven build-helper插件来选择特定于版本的源树.这一点很有效,直到发布时间为止;
使用分类器来限定版本不能很好地工作,因为源jar也需要自定义分类器('source-2.9.2'等),并且大多数IDE工具都不知道如何定位它们.
我尝试使用Maven属性将SBT样式_ $ {scala.version}后缀添加到工件名称,但Maven不喜欢工件名称中的属性.
SBT.一旦你能够理解它,它就能很好地工作(尽管有大量文档,但这不是一项小任务)缺点是似乎没有Maven阴影插件的等价物.我看过:
Proguard的.该插件未针对SBT 0.12.x进行更新,并且不会从源构建,因为它依赖于另一个已更改groupIds的SBT插件,并且在旧名称下没有0.12.x版本.我还没有弄清楚如何指示SBT忽略/替换插件依赖项.
OneJar.这使用自定义类加载来从嵌入式jar中运行Main类,这不是期望的结果; 我希望我的项目的类文件与我的着色依赖项中的(可能已重命名的)类文件一起放在jar中.
SBT Assembly插件.这可以在一定程度上起作用,但POM文件似乎包含我试图遮蔽的依赖项,这对我的最终用户没有帮助.
我接受可能没有一个解决方案能够满足我对Scala的需求,并且/或者我可能需要编写自己的Maven或Scala插件来实现目标.但如果我能找到现有的解决方案.
我接近@ Jon-Ander的优秀答案,但对我来说仍然有一个优秀的作品,这是一个统一的发布过程.我的build.sbt的当前状态是在GitHub上.(我将在稍后的回答中为后代再现它).
sbt-release插件不支持多版本构建(即,+ release不像人们喜欢的那样),这有点意义,因为版本标记的过程并不真正需要跨版本发生.但我希望这个过程的两个部分是多版本的:测试和发布.
我想要发生的事情类似于两阶段maven-release-plugin过程.第一阶段将执行更新Git和运行测试的管理工作,在这种情况下,这将意味着运行+ test以便对所有版本进行测试,标记,更新到快照,然后将结果推送到上游.
第二阶段将签出标记版本+ publish,并将重新运行测试并将标记版本推送到Sonatype存储库.
我怀疑我可以编写releaseProcess执行上述每个操作的值,但我不确定我是否可以支持多个releaseProcess值build.sbt.它可能适用于一些额外的范围,但SBT的那部分对我来说仍然很奇怪.
我目前所做的是改为releaseProcess不发布.然后我必须手动检查标记版本并运行+ publish事实,这接近我想要的但确实妥协,特别是因为测试仅在发布过程中的当前scala版本上运行.我可以使用像maven插件那样不是两个阶段的进程,但是实现了多版本测试和发布.
任何可以让我跨越最后一英里的额外反馈将不胜感激.
给定一个数据模型:
[DataContract]
public class Parent
{
[DataMember]
public IEnumerable<ChildId> Children { get; set; }
}
[DataContract]
public class ChildId
{
[DataMember]
public string Id { get; set; }
}
[DataContract]
public class ChildDetail : ChildId
{
[DataMember]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
出于实现方便的原因,有时候ChildId对象Parent实际上是ChildDetail对象.当我使用JSON.net来序列化时Parent,它们会被写出所有ChildDetail属性.
是否有任何方法可以指示JSON.net(或任何其他JSON序列化程序,我还没有足够的提交到项目中)在序列化为基类时忽略派生类属性?
编辑:重要的是,当我直接序列化派生类时,我能够生成所有属性.我只想抑制Parent对象中的多态性.
可能重复:
使用带有Scala保留字的Java Lib
我正在尝试使用Scala,我正在使用的Java库with在其中一个对象上有一个方法,但它with是Scala中的关键字.如何从我的Scala代码中调用此方法?
给定一对范围,已知其中一个范围包含另一个范围的元素:
src = ActiveSheet.UsedRange
sel = src.SpecialCells(xlCellTypeVisible)
Run Code Online (Sandbox Code Playgroud)
获取表示这两个范围之间的集合差异(即其中的单元格src不在其中)的新范围的最有效方法是什么sel?
这可以通过使用 中的单元格循环来完成src,但这需要对按范围m * n进行自动化调用,这没有很好的性能,并且我希望能够减少远程 API 调用。mn
在Bourne shell中捕获命令输出的标准方法是使用以下$()语法:
output=$(mycommand)
Run Code Online (Sandbox Code Playgroud)
但是,对于具有大量输出的命令,这需要shell将整个内存分配为一个长字符串.我宁愿找到一些与Unix C函数具有道德等价的东西popen,以获得一个新的文件描述符,我可以read:
newfd=popen(mycommand)
while read -u $newfd LINE; do
#process output
done
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?