我正在混合构建环境中设置我的第一个播放应用程序.我的公司使用maven来处理所有事情(到目前为止),并且我正在尝试让我的播放应用程序与其余的工件进行良好的交互.
有没有办法让ivy/sbt/play以类似于maven的方式处理SNAPSHOTs - 即,始终从远程存储库更新它们(例如,在构建工作者上)或使用本地.m2存储库直到依赖'过期'然后从服务器刷新它.
我在Build.scala中为一个工件声明了一个SNAPSHOT依赖项,我希望这个依赖项的本地更新对我的play项目可见.在maven方面,我做了以下几点
mvn clean install
Run Code Online (Sandbox Code Playgroud)
其中(当然)构建并将我的外部工件安装到我的本地maven存储库(在〜/ .m2/repository).我希望我的播放项目能立即看到这些更改,但我无法弄清楚如何告诉sbt/play不缓存SNAPSHOT.无论我做什么,这种依赖关系永远不会在游戏中刷新 - 我必须进入实际的游戏常春藤缓存并手动删除依赖关系以获取任何更改.理想情况下,我希望sbt/ivy只是解析我本地maven仓库的路径,而不是在内部缓存它.我的Build.scala中有以下内容
val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
resolvers += "Local Maven Repository" at "file://" + Path.userHome.absolutePath + "/.m2/repository",
testOptions in Test := Nil
)
Run Code Online (Sandbox Code Playgroud)
当我在游戏中运行构建时,它正确使用此repo,但随后将结果缓存在常春藤缓存中.有没有咒语我可以告诉Ivy/sbt不这样做?也许在ivysettings.xml中有什么东西?
我遇到了几个与SBT相关的案例让我感到难过.有没有办法告诉SBT在您进行交叉编译时完全跳过某个子项目?
以下是两个有用的例子.
1)具有三个项目A,B和C的构建.A和B都是scala项目,并且在其设置中具有'scalaVersions ++ = Seq("2.11.2","2.10.4").Project C是一个纯Java工件,因此我从它的依赖项中排除了Scala库.我希望A和B依赖于C,但理想情况下我只想建立一次C.如果我使用默认行为并从根聚合器项目执行"+发布",我会生成两个C-1.0.0.jar副本,并且SBT尝试将其发布两次,这当然是禁止的. maven存储库.
2)具有多个scala项目的构建,但是一个项目应该仅针对单个Scala版本构建.我已经尝试在这个项目的设置中定义'scalaVersions'只保留一个版本,其他项目有两个,但是从根聚合器再次"+发布"似乎忽略了这个并且仍然编译两次,第二次失败,因为它的依赖关系不适用于该Scala版本.这个项目是依赖图中的一个叶子节点,所以想要逻辑地做这件事是件好事.
对于情况#2,我已经考虑将'坏'scala版本的源dirs设置为/ dev/null或类似的东西,但实际上仍然运行构建并产生一个空的工件.我知道我可能会进去找到所有相关的键并做类似的事情
publishArtifact := if(scalaBinaryVersion.value == "2.10") false else publishArtifact.value
Run Code Online (Sandbox Code Playgroud)
然后搜索所有其他相关的设置/任务(编译,在Test中编译,在Test中测试,packageBin等)但这看起来很糟糕.某处有"跳过"设置吗?
我有一个scala语法问题 - 说我有一个简单的依赖模式构造,如下所示
trait Master {
val foobar
object SubObject extends SubObject {
foobar = foobar
}
}
trait SubObject {
val foobar
}
Run Code Online (Sandbox Code Playgroud)
显然,这不会编译,因为参考foobar = foobar是模糊的.
如何指定表达式的RHS应该引用Master的foobar变量?是否有一些我应该知道的"这个"或"自我"的特殊用法?
我有一个使用Core Data进行存储的iPhone应用程序.我已经成功部署了它,现在我正在开发第二个版本.我遇到了数据模型的问题,在持久性存储升级时需要一些非常简单的数据转换,所以我不能只使用默认的推断映射模型.
我的对象模型存储在.xcdatamodeld包中,版本1.0和1.1彼此相邻.版本1.1设置为活动版本.当我使用默认迁移行为并将NSInferMappingModelAutomaticallyOption设置为YES时,一切正常.我的sqlite存储从模型的1.0版本升级,一切都很好,当然,除了我需要做的少量转换.
作为额外的实验步骤,我向核心数据模型包添加了一个新的映射模型,并且没有对xcode生成的内容进行任何更改.当我运行我的应用程序(使用旧版本的数据存储)时,我得到以下内容
* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?这是我获取托管对象模型和持久性存储协调器的代码.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"gti_store.sqlite"]];
NSError *error;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeUrl
options:options
error:&error]) {
NSLog(@"Eror creating persistent store coodinator - %@", …Run Code Online (Sandbox Code Playgroud)