9

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

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

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

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

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

4

4 回答 4

11

在与 sbt-native-manager 团队讨论和第一个“被拒绝”的拉取请求之后,这是在 build.sbt 文件中进行此目录映射的方法(请参阅拉取请求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"))
于 2014-02-10T12:57:09.240 回答
6

您可以在目录方法结果之上使用一个简单的映射。

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

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

mappings in Universal ++= (directory("src/main/resources").map(t => (t._1, t._2.replace("resources", "conf"))))
于 2016-02-15T12:36:11.680 回答
5

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

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

import com.typesafe.sbt.SbtNativePackager.Universal

mappings in Universal += {
 file("my/local/conffile") -> "conf/my.conf"
}
于 2014-02-07T13:43:04.483 回答
0

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

解压后将所有文件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)
    }
}

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

于 2017-03-12T23:53:10.410 回答