小编Tom*_*aro的帖子

如果输入文件不变,如何使自定义任务避免重做工作?

我有一个游戏的多项目设置.有一个非常具体的子项目叫做"资源",只包含要打包到jar中的图像,声音和texfiles等文件.

我有一个自定义任务来处理图像并打包它们.在'src/main'里面,我正在使用一个文件夹'preprocess',其中图像应该去,而'unmanaged'文件夹,其他一切都在这里.通过运行我的任务,'preprocess'中的所有图像都被打包并输出到'resources','unmanaged'中的所有图像都按原样复制.

val texturePacker = TaskKey[Unit]("texture-packer", "Runs libgdx's Texture Packer")

val texturePackerTask = texturePacker := {
  println("Packaging textures...")
  val inputDir = file("resources/src/main/preprocess")
  val outputDir = file("resources/src/main/resources")

  val folders = inputDir.asFile.listFiles filter (_.isDirectory)

  println("Sub-Folders:" + folders.mkString(", "))

  // Run Texture Packer
  for (subfolder <- folders) {
    println("Building assets for:" + subfolder)
    val args = Array(subfolder.toString, outputDir.toString, subfolder.getName)
    com.badlogic.gdx.tools.imagepacker.TexturePacker2.main(args)
  }

  // Copy unmanaged resources
  IO.copyDirectory(file("resources/src/main/unmanaged"), file("resources/src/main/resources"))
}
Run Code Online (Sandbox Code Playgroud)

然后在'资源'项目的设置内:

...
packageBin in Compile <<= packageBin in Compile dependsOn(texturePacker)
...
Run Code Online (Sandbox Code Playgroud)

其他子项目依赖于与其运行相关联的packageBin.这样,每当我运行项目时,我都会获得最新的资源状态.我不希望它是按需的.问题是每次运行需要很长时间才能处理.我知道SBT支持缓存SBT常见问题,但我不明白如何使其适应我的任务.

如果未修改文件夹列表中子文件夹中的文件,如何使我的自定义任务避免重做工作?

scala sbt

7
推荐指数
1
解决办法
891
查看次数

如何通过反射获取Scala专用字段的参数的原始数据类型?

我有一个专门的字段的类,并使用原始数据类型.例如Tuple2 [Int,String]:

scala> class TupleReflection(val tuple: Tuple2[Int, String])
defined class TupleReflection

scala> val refl = new TupleReflection((5, "hello"))
refl: TupleReflection = TupleReflection@1a597ec8   
Run Code Online (Sandbox Code Playgroud)

我想现在使用反射来找出我的'refl'实例中的Tuple2的类型参数.(我用'头'来骗取场地,因为我知道这是唯一一个.)

scala> val field = refl.getClass.getDeclaredFields.head
field: java.lang.reflect.Field = private final scala.Tuple2 TupleReflection.tuple
Run Code Online (Sandbox Code Playgroud)

现在我有了该字段,我可以查询泛型类型.

scala> field.getGenericType
res41: java.lang.reflect.Type = scala.Tuple2<java.lang.Object, java.lang.String>
Run Code Online (Sandbox Code Playgroud)

现在的问题是第一种类型是Object.有没有办法通过单独的反射知道该参数的实际类型(Int)?

更新:

我在自己的API中使用自动序列化的上下文中使用它.给定一个标有@Serializable的类,我可以序列化它.为此,我必须使用反射递归地构建类的字段和类型的树,以便我可以进行深度序列化.

如果我直接使用@Specialized类,它可以工作,因为类型是显式的,并且在编译时在调用站点处是已知的.如果层次结构中的字段是@specialized,我无法通过反射来判断.查询类中声明的字段或方法不会产生正确的值.类型存在于运行时,但仅存在于字段中保存的实例上,而不是字段本身的声明上.因此,如果实例为null并且不能执行"getClass",我无法仅通过反射知道正确的类型.

reflection scala specialized-annotation

2
推荐指数
1
解决办法
837
查看次数

标签 统计

scala ×2

reflection ×1

sbt ×1

specialized-annotation ×1