将特定目录及其内容添加到Universal目标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将特定目录及其内容添加到Universal目标相关的知识,希望对你有一定的参考价值。

我正在从maven切换到sbt我正在研究的S​​cala项目。我曾经使用maven程序集插件,您可以将工作空间中的任何目录映射到程序集中的目标目录。我没有在sbt-native-package中找到任何等价物,值得为Universe类提供此功能。

我知道通用子目录中存在的所有东西都被复制到包中,它就像一个魅力,但我缺少类似下面的代码片段。

mappings in Universal += {
  directory("my/local/dir") -> "static/dirInPackage"
}

我想知道是否已经有办法做到这一点,在这种情况下,我很乐意知道该怎么做,如果你愿意,我建议我帮助提交该部分的文档。如果没有办法进行这种定制,我很乐意在讨论规范后提出补丁。

顺便说一句,干得好,你的打包工作得很好,谢谢!

答案

在与sbt-native-manager团队讨论并首次“拒绝”拉取请求之后,这里是在build.sbt文件中执行此目录映射的方法(请参阅提供模式详细文档的pull request https://github.com/sbt/sbt-native-packager/pull/160):

mappings in Universal <++= (packageBin in Compile, target ) map { (_, target) =>
    val dir = target / "scala-2.10" / "api"
    (dir.***) pair relativeTo(dir.getParentFile)
} 

为了减少上述代码片段的详细程度,有一个问题(https://github.com/sbt/sbt-native-packager/issues/161)提出了一种更易读的方式来表达这个目录映射:

mappings in Universal ++= allFilesRelativeTo(file(target / "scala-2.10" / "api"))
另一答案

来自https://github.com/sbt/sbt-native-packager

如果您想将其他文件添加到安装目录,只需将它们添加到通用映射:

import com.typesafe.sbt.SbtNativePackager.Universal

mappings in Universal += {
 file("my/local/conffile") -> "conf/my.conf"
}
另一答案

您可以在目录方法结果的顶部使用简单的映射。

==>目录方法文档:MappingsHelper.directory

例如://在/src/main/resources下打包conf的内容添加以下内容:

mappings in Universal ++= (directory("src/main/resources").map(t => (t._1, t._2.replace("resources", "conf"))))
另一答案

这个似乎是对我有用的最简单的例子

获取res/scripts/中的所有文件,并在解压缩时将其放入bin/目录中。

// In build.sbt
mappings in Universal <++= (packageBin in Compile) map { jar =>
  val scriptsDir = new java.io.File("res/scripts/")
  scriptsDir.listFiles.toSeq.map { f =>
    f -> ("bin/" + f.getName)
  }
}

如果您选择的文件未创建,则会为您创建,例如assets/将为文件创建一个新的assets文件夹。如果你想使用这种方法在这个内部的文件,你将不得不制作一个新的Seq至少这是我所做的。这是我的例子

assets/
├── scripts
│   └── install_dependencies.sh
└── urbangrizzly.database

和适当的build.sbt部分:

mappings in Universal <++= (packageBin in Compile) map { jar =>
    val assetsDir = new java.io.File("assets/")
    val scriptsDir = new java.io.File("assets/scripts")
    assetsDir.listFiles.toSeq.map { files =>
        files -> ("assets/" + files.getName)
    } ++ scriptsDir.listFiles.toSeq.map { files =>
        files -> ("assets/scripts/" + files.getName)
    }
}

如果您需要更多,只需继续使用++运算符来连接列表

以上是关于将特定目录及其内容添加到Universal目标的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 node.js 和 Promises 将特定行的行添加到文件的内容

提取 tar 存档,不包括特定文件夹及其内容

将一个目录及其所有内容批量复制到另一个目录

mac osX packageMaker:如何将目标设置为用户主目录?

Angular Universal:添加服务工作者不允许页面的特定标题

使用 AutoLayout 调整 UICollectionViewCell 及其内容的大小