从 sbt-native-packager 中的 Universal:packageBin 中排除非托管依赖项?
Posted
技术标签:
【中文标题】从 sbt-native-packager 中的 Universal:packageBin 中排除非托管依赖项?【英文标题】:Excluding unmanaged dependencies from universal:packageBin in sbt-native-packager? 【发布时间】:2014-05-01 17:15:40 【问题描述】:我有一个带有 jar 的外部 lib 目录。我需要将这些包含在我的类路径中以编译和测试我的项目,但我不想将它们包含在通过universal:packageBin
(在sbt-native-packager)(或dist
,如果你'重新使用playframework
。
我尝试通过使用provided
范围来做到这一点,如下所示:
unmanagedBase in Provided := new java.io.File("/external/lib")
但这似乎不像宣传的那样工作 - 罐子似乎没有包含在 Compile
范围内。
我正在使用 sbt 0.13.1。
【问题讨论】:
试试unmanageBase in packageBin := file("/external/lib")
不幸的是,@laughedelic,从编译范围中删除了 deps - 我仍然需要它们:(
unmanageBase in Compile := file("/external/lib")
对Compile
范围和packageBin
任务都没有帮助吗?如果没有,您可以单独设置。
抱歉,您误会了 - 我希望在编译(和测试)中使用非托管 jar,但我不希望它们包含在二进制分发中。我基本上是在尝试复制 Provided 范围在 Maven 中的作用。
有人知道怎么做吗?
【参考方案1】:
这很有效(感谢@jacek-laskowski 对我的回答的改进):
mappings in Universal := (mappings in Universal).value.filter case(jar, _) => jar.getParentFile != unmanagedBase.value
但是,它仍然感觉像是一个杂物,如果 sbt
(和 sbt-native-packager
)能够正确支持 Provided
范围,我会更喜欢它,因为这种情况正是它的意思。
【讨论】:
我会避免使用!_._1
并将filter
中的谓词替换为 case (x,y) if ... => ...
。【参考方案2】:
我建议以下解决方案:
mappings in Universal := (mappings in Universal).value filter case (jar, path) =>
jar.getParentFile != (unmanagedBase in Compile).value
它重复了mappings in Universal
,这可以通过~=
避免,但是没有提供.value
宏支持。
我认为该解决方案是类型安全的,因为它使用 unmanagedBase in Compile
设置的值 java.io.File
(而不是容易出现拼写错误的 java.lang.String
)。
【讨论】:
以上是关于从 sbt-native-packager 中的 Universal:packageBin 中排除非托管依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
Sbt-native-packager 在两台不同的机器上生成两个不同的包
如何使用 sbt-native-packager 设置 docker 镜像名称
如何在运行时为使用 sbt-native-packager 捆绑的应用程序加载配置文件